为什么 IEnumerable?.First() 不起作用?

Why doesn't IEnumerable?.First() work?

当我尝试在可枚举对象上使用 ?.First() 时,当对象不包含任何项目时它会抛出错误 "sequence contains no elements"。

我知道解决方案是使用 .FirstOrDefault(),但我不明白为什么我最初的努力不起作用。我是误会了什么还是只是 'one of those things'?

因为空集合不是null

空序列不是 null,它是一个没有任何项目的实际对象。 ?. 不调用有问题的成员 如果表达式是 null,它不是,所以调用 First,并且 First 传入空序列时抛出异常。

当序列不包含任何元素时,First() 显式抛出异常。如果没有元素,FirstOrDefault() 给出 null(编辑:或者更确切地说,它给出一个默认值,对于引用类型是 null)。您希望 First() 从空序列中 return 得到什么?

空条件运算符 (?) 在执行成员访问操作之前测试是否为空。空序列不为空,它只是不包含任何元素。因此,当您调用 First() 时,它会正确地失败,因为没有第一个元素。

根据 MSDN 文档:

    int? length = customers?.Length; // null if customers is null   
    Customer first = customers?[0];  // null if customers is null  
    int? count = customers?[0]?.Orders?.Count();  // null if customers, the first         customer, or Orders is null  

因此,如果您的集合不为 null,则运行时将尝试 return 第一个元素。由于集合是空的并且您没有使用 FirstOrDefault,因此抛出异常。

Link: https://msdn.microsoft.com/en-us/library/dn986595.aspx