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

时间:2009-05-06 10:14:29

标签: c# .net nullable

double? test = true ? null : 1.0;

在我的书中,这与

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

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

  

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

4 个答案:

答案 0 :(得分:28)

这是因为编译器尝试从右到左计算语句。 这意味着它会看到1.0并且它确定它是双倍(不是双倍?)然后它会看到null

因此doublenull之间显然没有隐式转换(实际上Structnull之间没有隐式转换。

你可以做的是明确地告诉编译器两个表达式中的一个可以相互转换。

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中,AB的类型必须相同,或者必须隐式转换为另一种类型。

答案 3 :(得分:2)

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

double? test = true ? (double?) null : 1.0;