为什么我需要将null合并运算符放在括号中?

Tim*_*ter 5 .net c# nullable operators

我最近注意到了一种好奇心(至少对我而言).我认为它null-coalescing operator会优先于任何数学运算,但显然我错了.我认为以下两个变量在最后会有相同的值:

double? previousValue = null;
double? v1 = 1 + previousValue ?? 0;
double? v2 = 1 + (previousValue ?? 0);
Run Code Online (Sandbox Code Playgroud)

但是v2.Value(期望的)1 v1.Value仍然是0.为什么?

演示

dle*_*lev 8

v1因为你提到的确切原因是0:null-coalescing运算符实际上具有相对较低的优先级.该表显示了究竟有多低.

因此,对于第一个表达式,1 + null首先进行求值,然后求值为a null int?,然后合并为0.