为什么 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
当我尝试在可枚举对象上使用 ?.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