为什么这个C#代码没有编译?
double? test = true ? null : 1.0;
在我的书中,这是一样的
if (true) { test = null; } else { test = 1.0; }
但是第一行给出了这个编译错误:
无法确定条件表达式的类型,因为“
”和“
double
”之间没有隐式转换。
发生这种情况是因为编译器尝试从右到左计算语句。 这意味着它看到1.0
并且它决定它是double(不是double?)然后它看到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
double? test = true ? (double?)null : 1.0;
将工作。 那是因为没有从第一个表达式( null
)的类型到第二个表达式( double
)的类型的转换。
在推导出?:表达式的类型时,不使用赋值的左侧。
在b ? A : B
b ? A : B
, A
和B
的类型必须相同,或者必须可以隐式转换为另一个。
因为编译器无法弄清楚null和1.0是否兼容,所以需要将值转换为double?。 这需要明确说明。
double? test = true ? (double?) null : 1.0;