2

考虑以下代码:

IEnumerable<int> xx = null;
var tt = xx?.Where(x => x > 2).Select(x => x.ToString());

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

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

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

ArgumentNullException在第三行会有yy == null.

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

4

2 回答 2

8

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

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

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

于 2018-02-16T17:06:59.817 回答
4

条件运算符或也称为空传播运算符短路的,即如果链中的一个操作:

var tt = xx?.Where(x => x > 2).Select(x => x.ToString());

返回null,然后链的其余部分停止执行。

因此,在上面的示例Where中,从不按原样xx调用null

至于第二个例子,你得到了一个,ArgumentNullException 因为那是扩展方法的行为。在这种特定情况下,当Select提供的选择器是.ArgumentNullExceptionnull

于 2018-02-16T17:06:30.910 回答