2

鉴于以下摘录:

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

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

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

  1. ?. 首先被评估
  2. -运算符应该评估下一个因为它的优先级高于 ??
  3. ?? 应该最后评估。

到底是怎么回事?

4

2 回答 2

3

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

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

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

因此,减法确实优先,但由于引入了空值合并运算符,它的结果被转换(通过允许空值短路)。

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

于 2016-02-22T20:06:36.877 回答
1
double result = value - text?.Length ?? 0;

这可以解释为:

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

这是0

于 2016-02-22T20:09:26.190 回答