3

当我尝试在可枚举对象上使用 ?.First() 时,当对象不包含任何项目时,它会引发错误“序列不包含元素”。

我认识到解决方案是使用 .FirstOrDefault(),但我不明白为什么我最初的努力不起作用。我是误解了什么还是只是“其中之一”?

4

5 回答 5

9

空序列不是null,它是一个实际对象,其中没有任何项目。 如果表达式是?.则不调用相关成员,否则调用,并在传递空序列时引发异常。nullFirstFirst

于 2016-12-20T17:14:55.797 回答
5

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

于 2016-12-20T17:16:07.960 回答
4

因为空集合不是null

于 2016-12-20T17:14:44.800 回答
3

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

于 2016-12-20T17:15:26.223 回答
3

根据 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  

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

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

于 2016-12-20T17:26:34.197 回答