在nullable int和int之间转换

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控制条件表达式的类型.

  • 如果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
Run Code Online (Sandbox Code Playgroud)

或者,正如谢尔盖在他的回答中直接提到的:

int? l = (int?)lc;
Run Code Online (Sandbox Code Playgroud)


Ser*_*kiy 7

只需将可空的枚举值转换为可以为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?的包装.

  • 我自己就是这么想的.:) (3认同)