为什么我可以在调用链中省略后续的空条件运算符?

tsu*_*sul 1 c# null-conditional-operator

考虑以下代码:

IEnumerable<int> xx = null;
var tt = xx?.Where(x => x > 2).Select(x => x.ToString());
Run Code Online (Sandbox Code Playgroud)

它分配nulltt. 问题是:为什么它可以正常工作?

我想我必须?.在 Select as ?.Where(...)returns之前使用null。此外,如果我将第二行分成两行:

IEnumerable<int> xx = null;
var yy = xx?.Where(x => x > 2);
var zz = yy.Select(x => x.ToString());
Run Code Online (Sandbox Code Playgroud)

ArgumentNullException第三行会有yy == null

有什么魔力?:)
如果这是因为短路,我从没想过它会像这样。

BJ *_*ers 7

是的,这是由于短路造成的。从MSDN 参考

...[T]空条件运算符是短路的。如果条件成员访问和索引操作链中的一个操作返回 null,则链的其余部分将停止执行。

您的第二个示例抛出的原因是因为您有单独的未链接语句。短路不能应用于多个语句。

  • MSDN 并不那么明确,但这*就是*解释。具有相同优先级的任何其他链式操作都将被忽略,无论它们是否使用条件。在下一句中,MSDN 澄清只有具有*较低优先级*的操作才会继续执行。 (3认同)