use*_*189 1 c# int enumeration nullable
我想做这样的事情:
int? l = lc.HasValue ? (int)lc.Value : null;
Run Code Online (Sandbox Code Playgroud)
其中lc是可以为空的枚举类型,比如EMyEnumeration?.所以我想测试lc是否有值,所以如果然后将其int值赋给l,否则l为null.但是当我这样做时,C#抱怨'无法确定条件表达式的错误类型,因为'int'和''之间没有隐式转换.
我怎样才能使它正确?提前致谢!!
Tim*_*ter 10
你也必须施展null:
int? l = lc.HasValue ? (int)lc.Value : (int?)null;
Run Code Online (Sandbox Code Playgroud)
顺便说一句,这是条件运算符和a 之间的差异之一if-else:
if (lc.HasValue)
l = (int)lc.Value;
else
l = null; // works
Run Code Online (Sandbox Code Playgroud)
相关的C#规范是7.14条件运算符:
第二个和第三个操作数x和y ?: operator控制条件表达式的类型.
由于int无法转换为null隐式,反之亦然,因此会出现编译错误.但你也可以投的enum,以int?代替int其是敞篷车.然后编译器可以派生类型,它将编译:
int? l = lc.HasValue ? (int?)lc.Value : null; // works also
Run Code Online (Sandbox Code Playgroud)
或者,正如谢尔盖在他的回答中直接提到的:
int? l = (int?)lc;
Run Code Online (Sandbox Code Playgroud)
只需将可空的枚举值转换为可以为null的整数:
int? l = (int?)lc;
Run Code Online (Sandbox Code Playgroud)
由于C#规范6.2.3显式可空转换:
如果可空转换来自S,则基于从S到T的基础转换的可空转换的评估如下进行:到T?:
- 如果源值为null(HasValue属性为false),则结果为类型T?的空值.
- 否则,转换被评估为从S展开?到S,然后是从S到T的底层转换,接着是从T到T?的包装.
| 归档时间: |
|
| 查看次数: |
1292 次 |
| 最近记录: |