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

double? test = true ? null : 1.0; 

在我的书中,这是一样的

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

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

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

发生这种情况是因为编译器尝试从右到左计算语句。 这意味着它看到1.0并且它决定它是double(不是double?)然后它看到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 
 double? test = true ? (double?)null : 1.0; 

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

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

b ? A : B b ? A : BAB的类型必须相同,或者必须可以隐式转换为另一个。

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

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