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(第三个操作数的类型) - 但是没有转换null为int,所以它失败了.
将任一个操作数转换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是条件表达式的类型.
否则,无法确定表达式类型,并发生编译时错误.