12
double? test = true ? null : 1.0;

在我的书中,这与

if (true) {
  test = null;
} else {
  test = 1.0;
}

但是第一行给出了这个编译器错误:

无法确定条件表达式的类型,因为 ' <null>' 和 ' double' 之间没有隐式转换。

4

4 回答 4

28

发生这种情况是因为编译器试图从右到左评估语句。这意味着它看到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
于 2009-05-06T10:16:37.607 回答
8
double? test = true ? (double?)null : 1.0;

将工作。这是因为没有从第一个表达式 ( null) 的类型到第二个表达式 ( double) 的类型的转换。

于 2009-05-06T10:16:26.127 回答
4

推导 ?: 表达式的类型时,不使用赋值的左侧。

在中,和b ? A : B的类型必须相同,或者一个必须隐式转换为另一个。AB

于 2009-05-06T10:23:41.803 回答
2

因为编译器无法确定 null 和 1.0 兼容,所以需要将值强制转换为 double?。这需要明确说明。

double? test = true ? (double?) null : 1.0;
于 2009-05-06T10:17:48.807 回答