在nullable int和int之间转换

时间:2014-01-10 10:13:30

标签: c# int nullable enumeration

我想做这样的事情:

int? l = lc.HasValue ? (int)lc.Value : null; 

其中lc是可以为空的枚举类型,比如EMyEnumeration?。所以我想测试lc是否有值,所以如果然后将其int值赋给l,否则l为null。但是当我这样做时,C#抱怨条件表达式的错误类型无法确定,因为' int'之间没有隐式转换。和'。

如何使其正确?在此先感谢!!

3 个答案:

答案 0 :(得分:10)

您还必须投射null

int? l = lc.HasValue ? (int)lc.Value : (int?)null; 

顺便说一句,这是conditional operatorif-else之间的差异之一:

if (lc.HasValue)
    l = (int)lc.Value;
else
    l = null;  // works

相关的C#规范是 7.14条件运算符

?: operator的第二个和第三个操作数x和y控制条件表达式的类型。

  • 如果x的类型为X,则y的类型为Y.
    • 如果从X到Y存在隐式转换(第6.1节),而不是从Y到X,则Y是条件表达式的类型。
    • 如果从Y到X存在隐式转换(第6.1节),而不是从X到Y,则X是条件表达式的类型。
    • 否则,无法确定表达式类型,并发生编译时错误。

由于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;