隐式转换Null-Coalescing运算符结果

Man*_*ani 6 c# nullable null-coalescing-operator implicit-cast

通过以下对C#中的空合并运算符(??)的理解.

int? input = -10;
int result = input ?? 10;//Case - I
//is same as:
int result = input == null? input : 10; // Case - II
Run Code Online (Sandbox Code Playgroud)

而根据定义和用法,案例I和案例II是相同的.

令人惊讶的是,在Case-I编译器中能够隐式转换int吗?to case而在Case-II中它显示错误:'错误1无法隐式转换类型'int?' 'int'"

关于null-coalescing运算符,我错过了什么?

谢谢你的关注.

Pla*_*ure 5

要使第二种情况适用于三元运算符,您可以使用以下代码:

int result = input != null ? input.Value : 10;
Run Code Online (Sandbox Code Playgroud)

该类型的Value属性Nullable<T>返回T值(在本例中为int).

另一种选择是使用Nullable<T>.HasValue:

int result = input.HasValue ? input.Value : 10;
Run Code Online (Sandbox Code Playgroud)

myNullableInt != null构造仅是上述HasValue调用的语法糖.


Ant*_*ram 5

您在null-coalescing运算符中观察到的这种行为??是一种文档化的语言功能,有关详细信息,请参阅C#4.0语言规范的第7.13节.

表达式的类型a ?? b取决于操作数上可用的隐式转换.按优先顺序排列,类型为?? b是A0,A或B,其中A是a的类型(假设a具有类型),B是b的类型(假设b具有类型),并且A0是A的基础类型,如果A是可以为空的类型,否则为A. 具体来说,一个?? b处理如下:

  • 如果A存在且不是可空类型或引用类型,则发生编译时错误.

  • 如果b是动态表达式,则结果类型是动态的.在运行时,首先评估a.如果a不为null,则a将转换为dynamic,这将成为结果.否则,评估b,结果成为结果.

  • 否则,如果A存在且是可空类型,并且存在从b到A0的隐式转换,则结果类型为A0.在运行时,首先评估a.如果a不为null,则打开a以键入A0,这将成为结果.否则,b被评估并转换为类型A0,这就成了结果.

  • 否则,如果A存在且从b到A存在隐式转换,则结果类型为A.在运行时,首先计算a.如果a不为null,则a成为结果.否则,b被评估并转换为类型A,这就是结果.

  • 否则,如果b具有类型B并且从a到B存在隐式转换,则结果类型为B.在运行时,首先计算a.如果a不为null,则打开a以键入A0(如果A存在且可为空)并转换为类型B,这将成为结果.否则,b被评估并成为结果.

  • 否则,a和b不兼容,并发生编译时错误.

有关条件运算符的a ? b : c工作原理,请参见第7.14节.

下载规范,以便在闲暇时完整阅读.