一个小问题。任何想法的人为什么这不起作用?
int? nullableIntVal = (this.Policy == null) ? null : 1;
如果左手表达式为True,我试图返回null
,否则1
。看似简单,但会出现编译错误。
无法确定条件表达式的类型,因为null
和int
之间没有隐式转换。
如果我将null
中的? null : 1
替换为任何有效的int
,那么就没有问题。
答案 0 :(得分:21)
是 - 编译器无法为条件表达式找到合适的类型。忽略您将其分配给int?
的事实 - 编译器不使用该信息。所以表达式是:
(this.Policy == null) ? null : 1;
这个表达的类型是什么?语言规范声明它必须是第二个操作数的类型或第三个操作数的类型。 null
没有类型,因此它必须是int
(第三个操作数的类型) - 但是没有null
到int
的转换,所以它失败了。
将其中一个操作数转换为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;
。
原因(从评论中复制):
错误消息是因为?:
运算符(null
和1
)的两个分支没有兼容类型。新解决方案的分支(使用null
和(int?)1
)可以。
答案 4 :(得分:1)
INT? i =(true?new int?():1);