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