You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 09:01:31