double? test = true ? null : 1.0;
在我的书中,这与
if (true) {
test = null;
} else {
test = 1.0;
}
但是第一行给出了这个编译器错误:
无法确定条件表达式的类型,因为 '
<null>' 和 'double' 之间没有隐式转换。
发生这种情况是因为编译器试图从右到左评估语句。这意味着它看到1.0并决定它是双倍的(不是双倍的?)然后它看到null.
所以显然和之间没有隐式转换(实际上double和之间没有隐式转换)。nullStructnull
您可以做的是明确告诉编译器两个表达式之一可以相互转换。
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的类型必须相同,或者一个必须隐式转换为另一个。AB
因为编译器无法确定 null 和 1.0 兼容,所以需要将值强制转换为 double?。这需要明确说明。
double? test = true ? (double?) null : 1.0;