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