当我尝试在可枚举对象上使用 ?.First() 时,当对象不包含任何项目时,它会引发错误“序列不包含元素”。
我认识到解决方案是使用 .FirstOrDefault(),但我不明白为什么我最初的努力不起作用。我是误解了什么还是只是“其中之一”?
当我尝试在可枚举对象上使用 ?.First() 时,当对象不包含任何项目时,它会引发错误“序列不包含元素”。
我认识到解决方案是使用 .FirstOrDefault(),但我不明白为什么我最初的努力不起作用。我是误解了什么还是只是“其中之一”?
空序列不是null
,它是一个实际对象,其中没有任何项目。 如果表达式是,?.
则不调用相关成员,否则调用,并在传递空序列时引发异常。null
First
First
null 条件运算符 (?) 在执行成员访问操作之前测试 null。空序列不为空,它只是不包含任何元素。因此,当您调用 First() 时,它正确地失败了,因为没有第一个元素。
因为空集合不是null
。
当序列不包含任何元素时,First() 显式抛出异常。null
如果没有元素,FirstOrDefault() 给出(编辑:或者更确切地说,它给出了一个默认值,对于引用类型是null
)。您希望 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
因此,如果您的集合不为空,则运行时将尝试返回第一个元素。由于集合是空的并且您没有使用FirstOrDefault,因此会引发异常。