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

为何未添加合适括号会导致Sum运算结果不符合预期?

为什么添加括号后Sum运算结果才正确?

核心原因是C#运算符优先级的差异导致计算顺序不同,进而影响了最终结果。

运算符优先级规则

在C#中,+(加法运算符)的优先级高于??(空合并运算符),编译器会优先执行加法操作,再处理空合并逻辑。

未加括号的错误写法分析

代码:

items.Sum(x => x.Price + x.Options?.Sum(c => c.Price) ?? 0);

实际执行顺序:

  1. 先计算 x.Price + x.Options?.Sum(c => c.Price)
  2. 再对第一步的结果执行 ?? 0

结合你的测试数据,最后两个Item的Options为null:

  • x.Options?.Sum(...)返回null,此时x.Price + null的结果是null(decimal和decimal?相加,结果为可空的decimal?类型)
  • 接着执行null ?? 0,最终这个Item的贡献值被计算为0,而非预期的x.Price本身(比如最后一个Item的5.30M被当成0处理,导致总和少了这部分)

加括号的正确写法分析

代码:

items.Sum(x => x.Price + (x.Options?.Sum(c => c.Price) ?? 0));

括号强制改变了运算顺序:

  1. 先执行括号内的 x.Options?.Sum(c => c.Price) ?? 0:
    • 如果Options为null,直接返回0
    • 如果Options存在但所有Price都是null,Sum结果为null,同样返回0
  2. 再用x.Price(decimal类型)加上这个0(decimal类型),结果就是x.Price本身,不会出现null的情况,每个Item的贡献值都能正确计算

测试数据验证

测试数据中四个Item的Price总和为:4.20 + 6.00 + 1.30 + 5.30 = 16.80,对应加括号的输出。
未加括号时,最后两个Item的贡献值都被算成0,总和为4.20 + 6.00 + 0 + 0 = 10.20,和你的测试结果完全一致。

内容的提问来源于stack exchange,提问作者Lewis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 06:50:50