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

可空整数运算为何不抛出异常?优先级疑问解析

C#可空类型运算疑问解答

我不确定这是Bug还是设计本意,希望有人能解释原因。请看以下代码:

var someMetric = GetMetric(); // returns 3000
var someNullableMetric = GetNullableMetric(); // returns null

// 不符合预期
var total = someMetric + someNullableMetric; // 为什么返回null而非抛出异常?
var Total = someMetric + someNullableMetric ?? 0; // 为什么加法运算先于??执行?

// 符合预期
var Total = someMetric + (someNullableMetric ?? 0); // 这个逻辑是通顺的

疑问1:非可空整数与null的可空整数相加为何返回null而非抛出异常?

这是C#可空类型的设计本意。当非可空值类型(如int)和对应可空类型(如int?)进行运算时,编译器会自动将非可空类型提升为可空类型。可空类型的运算规则是:只要参与运算的任意一个值为null,运算结果就会是null。

这种设计是为了适配数据库、外部接口等场景中常见的缺失值场景,保留"缺失值"的语义传递,避免单个缺失值直接导致运算中断抛出异常。

疑问2:为何someMetric + someNullableMetric ?? 0中加法优先级高于空合并运算符???

这是C#运算符优先级的明确规定:算术运算符(包括+)的优先级高于空合并运算符??。因此表达式会先执行someMetric + someNullableMetric得到null,再执行null ?? 0得到0——这和你预期的"先执行someNullableMetric ?? 0再做加法"逻辑不符,所以才会觉得不符合预期。如果要改变运算顺序,必须像第三个例子那样用括号明确包裹someNullableMetric ?? 0,强制优先执行空合并操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 13:54:57