我不确定这是一个错误还是有意为之,但我希望这里有人能更多地了解为什么会发生这种情况。
考虑这段代码
var someMetric = GetMetric(); // returns 3000
var someNullableMetric = GetNullableMetric(); // returns null
// Doesn't work
var total = someMetric + someNullableMetric; // why does this return null and not throw an error?
var Total = someMetric + someNullableMetric ?? 0; // why is '+' done prior to '??'
// Works
var Total = someMetric + (someNullableMetric ?? 0); // this understandably works
只是寻找一个解释,因为这个功能是完全出乎意料的,空合并运算符不属于 BODMAS,所以我会假设它会首先执行(尽管最后一种现在我正在输入它更有意义)?或者尝试将 null 添加到值时会引发异常。
这绝对是预期的设计:
由于提升了运算符
,
someMetric + someNullableMetric
评估为 null
。如果您想强制例外,您可以随时使用 someMetric + someNullableMetric.Value
来代替。
someMetric + someNullableMetric ?? 0
等同于 (someMetric + someNullableMetric) ?? 0
,因为 +
的 优先级 高于 ??
。
如果您想要例外,请使用
someNullableMetric.Value
。如果您不想要例外,请根据问题代码的最后一行使用 (someNullableMetric ?? 0)
。