double? test = true ? null : 1.0;
在我的书中,这与
if (true) {
test = null;
} else {
test = 1.0;
}
但是第一行给出了这个编译器错误:
无法确定条件表达式的类型,因为 '
<null>
' 和 'double
' 之间没有隐式转换。
发生这种情况是因为编译器试图从右到左评估语句。这意味着它看到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
double? test = true ? (double?)null : 1.0;
将工作。这是因为没有从第一个表达式 ( null
) 的类型到第二个表达式 ( double
) 的类型的转换。
推导 ?: 表达式的类型时,不使用赋值的左侧。
在中,和b ? A : B
的类型必须相同,或者一个必须隐式转换为另一个。A
B
因为编译器无法确定 null 和 1.0 兼容,所以需要将值强制转换为 double?。这需要明确说明。
double? test = true ? (double?) null : 1.0;