.NET 4.7.2与.NET 6中Coalesce运算符代码结果差异咨询
.NET Framework 4.7.2与.NET 6中null值运算结果差异的原因
问题代码
public static void Main() { decimal? angka1 = null; decimal angka2 = 10; decimal hasil; hasil = angka2 - angka1 ?? 0; Console.WriteLine("Hello World: " + hasil); }
现象说明
这段代码在.NET Framework 4.7.2环境下输出10,但在.NET 6环境下输出0,与预期的angka2(即10)不符。
核心原因
差异源于C#语言版本中空合并运算符??的优先级调整:
- 在C# 4.0之前,
??的优先级高于算术运算符(如-),编译器会将表达式解析为:
当hasil = angka2 - (angka1 ?? 0);angka1为null时,angka1 ?? 0返回0,最终计算10 - 0 = 10,这就是.NET Framework 4.7.2环境的输出结果(若该环境使用的C#版本低于4.0,或编译选项指定旧版规则)。 - 在C# 4.0及之后的版本(包括.NET 6默认使用的C#版本),
??的优先级被调整为低于算术运算符,表达式会被解析为:
由于hasil = (angka2 - angka1) ?? 0;decimal?与decimal运算的结果是decimal?类型,当angka1为null时,angka2 - angka1的结果为null,再通过?? 0将null替换为0,最终输出0。
解决方案
若要在所有C#版本中得到预期结果(angka1为null时结果等于angka2),需显式添加括号明确运算顺序:
hasil = angka2 - (angka1 ?? 0);
这样无论??的优先级规则如何,都会先计算angka1 ?? 0,再执行减法运算,确保结果符合预期。
内容的提问来源于stack exchange,提问作者Haminteu
相关产品推荐
相关产品推荐

