为什么这个C#代码没有编译?

Rob*_*Dam 11 .net c# nullable

double? test = true ? null : 1.0;
Run Code Online (Sandbox Code Playgroud)

在我的书中,这是一样的

if (true) {
  test = null;
} else {
  test = 1.0;
}
Run Code Online (Sandbox Code Playgroud)

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

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

lep*_*pie 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
Run Code Online (Sandbox Code Playgroud)


Dav*_*itt 8

double? test = true ? (double?)null : 1.0;
Run Code Online (Sandbox Code Playgroud)

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