如何使用Nullable Int的条件运算

时间:2010-05-21 10:45:42

标签: c# nullable conditional-operator

一个小问题。任何想法的人为什么这不起作用?

int? nullableIntVal = (this.Policy == null) ? null : 1;

如果左手表达式为True,我试图返回null,否则1。看似简单,但会出现编译错误。

无法确定条件表达式的类型,因为nullint之间没有隐式转换。

如果我将null中的? null : 1替换为任何有效的int,那么就没有问题。

5 个答案:

答案 0 :(得分:21)

是 - 编译器无法为条件表达式找到合适的类型。忽略您将其分配给int?的事实 - 编译器不使用该信息。所以表达式是:

(this.Policy == null) ? null : 1;

这个表达的类型是什么?语言规范声明它必须是第二个操作数的类型或第三个操作数的类型。 null没有类型,因此它必须是int(第三个操作数的类型) - 但是没有nullint的转换,所以它失败了。

将其中一个操作数转换为int?并且它将起作用,或使用另一种方法来计算空值 - 所以这些中的任何一个:

(this.Policy == null) ? (int?) null : 1;

(this.Policy == null) ? null : (int?) 1;

(this.Policy == null) ? default(int?) : 1;

(this.Policy == null) ? new int?() : 1;

我同意你必须这样做有点痛苦。


从C#3.0语言规范第7.13节:

  

第二和第三个操作数   ?:操作员控制的类型   条件表达式。设X和Y为   第二和第三类型   操作数。然后,

     
      
  • 如果X和Y是相同的类型,那么这是条件的类型   表达

  •   
  • 否则,如果从X到Y存在隐式转换(第6.1节),但不存在   从Y到X,然后是Y的类型   条件表达。

  •   
  • 否则,如果从Y到X存在隐式转换(第6.1节),但不存在   从X到Y,然后是X的类型   条件表达。

  •   
  • 否则,无法确定表达式类型和编译时错误   发生。

  •   

答案 1 :(得分:4)

试试这个:

int? nullableIntVal = (this.Policy == null) ? (int?) null : 1; 

答案 2 :(得分:2)

也许你可以试试:

default( int? );

而不是null

答案 3 :(得分:1)

这有效:int? nullableIntVal = (this.Policy == null) ? null : (int?)1;

原因(从评论中复制):

错误消息是因为?:运算符(null1)的两个分支没有兼容类型。新解决方案的分支(使用null(int?)1)可以。

答案 4 :(得分:1)

INT? i =(true?new int?():1);