有人可以使用 C# 6.0 解释优先规则吗?运营商与 ??和算术运算?

Can someone explain the precedence rules using the C# 6.0 ?. operator with ?? and arithmetic ops?

给出以下摘录:

double value = 10;
string text = null;
double result = value - text?.Length ?? 0;

结果为 0,我无法理解这里发生的实际操作。

考虑到我理解的运算符的优先级,我原以为结果会是 10:

  1. ?。首先被评估
  2. - 运算符应该计算 next,因为它比 ??
  3. 具有更高的优先级
  4. ??应该最后评估。

这是怎么回事?

不要被新语法所迷惑,它只是对 null 的减法。尝试减去 null 会使减法语句短路,从而导致 null 本身。这就是为什么它归结为 ?? 0 而你总体上得到 0。 ?? 允许短路。没有它你会得到一个明显的编译器错误。

例如,让我们删除新语法并编写为:

Console.WriteLine(10 - null ?? 0);
// Prints 0

所以减法确实优先,但由于引入了空合并运算符,它的结果发生了变化(允许空短路)。

我个人认为以上也应该是编译器错误,因为它给人一种模棱两可的感觉。从视觉上看,它没有任何意义(至少在我看来)我也不会赞成这样编写的代码。显式括号是必须的。

double result = value - text?.Length ?? 0;

这可以解释为:

result = (value -  text)==null ? 0
(10 -  null)==null ? 0 
null == null ? 0 

这是 0