下面的C#代码:
int? i;
i = (true ? null : 0);
给我错误:
条件表达式的类型不能 确定是因为没有 '< null>'之间的隐式转换 和'int'
这不应该有效吗?我在这里缺少什么?
答案 0 :(得分:92)
编译器尝试评估右手表达式。 null
为null
,0
为int
字面,而不是int?
。编译器试图告诉您它无法确定表达式应该评估的类型。 null
和int
之间没有隐式转换,因此出现错误消息。
您需要告诉编译器表达式应该评估为int?
。 int?
和int
之间或null
和int?
之间存在隐式转换,因此其中任何一个都应该有效:
int? x = true ? (int?)null : 0;
int? y = true ? null : (int?)0;
答案 1 :(得分:15)
在处理三元运算符时,您需要使用 default()关键字而不是null。
示例:
int? i = (true ? default(int?) : 0);
或者,您可以直接转换null:
int? i = (true ? (int?)null : 0);
就个人而言,我坚持使用default()
符号,这只是一种偏好,真的。但你最终应该坚持一个特定的符号,恕我直言。
HTH!
答案 2 :(得分:1)
部分(true ? null : 0)
在某种程度上成为一种功能。此函数需要返回类型。当编译器需要找出它不能的返回类型时。
这有效:
int? i;
i = (true ? null : (int?)0);