如何使用Nullable Int的条件运算

Raj*_*shi 8 c# nullable conditional-operator

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

int? nullableIntVal = (this.Policy == null) ? null : 1;
Run Code Online (Sandbox Code Playgroud)

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

无法确定条件表达式的类型,因为null和之间没有隐式转换int.

如果我用任何有效的替换nullin ,那么没有问题.? null : 1int

Jon*_*eet 21

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

(this.Policy == null) ? null : 1;
Run Code Online (Sandbox Code Playgroud)

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

将任一个操作数转换int?为它将起作用,或者使用另一种方法来消除null值 - 所以这些中的任何一个:

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

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

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

(this.Policy == null) ? new int?() : 1;
Run Code Online (Sandbox Code Playgroud)

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


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

?:运算符的第二个和第三个操作数控制条件表达式的类型.设X和Y是第二个和第三个操作数的类型.然后,

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

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

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

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