为何未添加合适括号会导致Sum运算结果不符合预期?
为什么添加括号后Sum运算结果才正确?
核心原因是C#运算符优先级的差异导致计算顺序不同,进而影响了最终结果。
运算符优先级规则
在C#中,+(加法运算符)的优先级高于??(空合并运算符),编译器会优先执行加法操作,再处理空合并逻辑。
未加括号的错误写法分析
代码:
items.Sum(x => x.Price + x.Options?.Sum(c => c.Price) ?? 0);
实际执行顺序:
- 先计算
x.Price + x.Options?.Sum(c => c.Price) - 再对第一步的结果执行
?? 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));
括号强制改变了运算顺序:
- 先执行括号内的
x.Options?.Sum(c => c.Price) ?? 0:- 如果
Options为null,直接返回0 - 如果
Options存在但所有Price都是null,Sum结果为null,同样返回0
- 如果
- 再用
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
相关产品推荐
相关产品推荐

