鉴于以下摘录:
double value = 10;
string text = null;
double result = value - text?.Length ?? 0;
结果是 0,我无法理解这里发生的实际操作。
我原以为结果会是 10,而不是考虑到我理解的运算符的优先级:
- ?. 首先被评估
- -运算符应该评估下一个,因为它的优先级高于 ??
- ?? 应该最后评估。
到底是怎么回事?
鉴于以下摘录:
double value = 10;
string text = null;
double result = value - text?.Length ?? 0;
结果是 0,我无法理解这里发生的实际操作。
我原以为结果会是 10,而不是考虑到我理解的运算符的优先级:
到底是怎么回事?
不要被新语法所迷惑,它只是对 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