double? test = true ? null : 1.0;
在我的书中,这与
相同if (true) {
test = null;
} else {
test = 1.0;
}
但是第一行给出了这个编译错误:
条件表达式的类型不能 确定是因为没有 '
<null>
'之间的隐式转换 和'double
'。
答案 0 :(得分:28)
这是因为编译器尝试从右到左计算语句。
这意味着它会看到1.0
并且它确定它是双倍(不是双倍?)然后它会看到null
。
因此double
和null
之间显然没有隐式转换(实际上Struct
和null
之间没有隐式转换。
你可以做的是明确地告诉编译器两个表达式中的一个可以相互转换。
double? test = true ? null : (double?) 1.0; // 1
double? test = true ? (double?)null : 1.0; // 2
double? test = true ? default(double?) : 1.0; // 3
double? test = true ? new double?() : 1.0; // 4
答案 1 :(得分:8)
double? test = true ? (double?)null : 1.0;
会奏效。那是因为没有第一个表达式(null
)的类型转换为第二个表达式(double
)的类型。
答案 2 :(得分:4)
在推断?:表达式的类型时,不使用赋值的左侧。
在b ? A : B
中,A
和B
的类型必须相同,或者必须隐式转换为另一种类型。
答案 3 :(得分:2)
因为编译器无法弄清楚null和1.0是否兼容,所以需要将值强制转换为double?。这需要明确说明。
double? test = true ? (double?) null : 1.0;