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

时间:2012-01-17 16:32:23

标签: 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

虽然根据定义和用法,案例I和案例II是相同的。

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

关于null-coalescing运算符我缺少什么?

感谢您的关注。

4 个答案:

答案 0 :(得分:5)

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

int result = input != null ? input.Value : 10;

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

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

int result = input.HasValue ? input.Value : 10;

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

答案 1 :(得分:5)

您在空合并运算符??中观察到的这种行为是一种文档化的语言功能,有关详细信息,请参阅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,则转换为   动态,这就成了结果。否则,评估b,并且   这就是结果。

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

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

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

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

  •   

请参阅第7.14节,了解条件运算符a ? b : c的工作原理。

Download the specification在您闲暇时完整阅读。

答案 2 :(得分:0)

int result = input == null ? input : 10;

你在第二种情况下混淆了你的情况 - 你可能意味着

int result = input != null ? input : 10;

现在这不会编译,因为与三元运算符一起使用的两个类型必须完全相同(并且int?int不同) - 您可以使用简单的强制转换作为解决方案:

int result = input != null ? (int)input : 10;

答案 3 :(得分:-1)

更简洁的解释:

int? NULL_Int = 1;
int NORM_Int = 2;

NULL_Int = NORM_Int;  // OK

NORM_Int = NULL_Int;  // NO, you can't assign a null to an int