可空整数运算为何不抛出异常?优先级疑问解析
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
相关产品推荐
相关产品推荐

