我想做这样的事情:
int? l = lc.HasValue ? (int)lc.Value : null;
其中lc是可以为空的枚举类型,比如EMyEnumeration?。所以我想测试lc是否有值,所以如果然后将其int值赋给l,否则l为null。但是当我这样做时,C#抱怨条件表达式的错误类型无法确定,因为' int'之间没有隐式转换。和'。
如何使其正确?在此先感谢!!
答案 0 :(得分:10)
您还必须投射null
:
int? l = lc.HasValue ? (int)lc.Value : (int?)null;
顺便说一句,这是conditional operator和if-else
之间的差异之一:
if (lc.HasValue)
l = (int)lc.Value;
else
l = null; // works
相关的C#规范是 7.14条件运算符:
?: operator
的第二个和第三个操作数x和y控制条件表达式的类型。
由于int
无法隐式转换为null
,反之亦然,因此会出现编译错误。但您也可以将enum
转换为int?
,而不是 可兑换的int
。然后编译器可以派生类型,它将编译:
int? l = lc.HasValue ? (int?)lc.Value : null; // works also
或者,正如谢尔盖在他的answer中直接提到的那样:
int? l = (int?)lc;
答案 1 :(得分:7)
只需将可以为空的枚举值转换为可以为null的整数:
int? l = (int?)lc;
由于C#规范6.2.3显式可空转换:
基于底层转换评估可空转换 如果可空转换来自S,则从S到T进行如下操作?到T?:
- 如果源值为null(HasValue属性为false),则结果为T?类型的空值。
- 否则,转换被评估为从S展开?到S,然后是从S到T的底层转换,接着是a 从T包裹到T?。
答案 2 :(得分:0)
你应该这样:
int? l = lc.HasValue ? (int)lc.Value : (int?)null;