空传播 ?.First() 与 .FirstOrDefault()

Null propagated ?.First() vs .FirstOrDefault()

在使用空传播运算符一段时间后,我无意中写了一个用于选择单个项目的 linq 子句。是否有理由(性能、最佳实践)不使用 ?.First()?

MyList?.First();

MyList.FirstOrDefault();

这不是性能或最佳实践的问题;他们只是不做同样的事情。

如果 MyList 为空,

MyList?.First() 将 return 为空(由于空传播运算符,First() 甚至不会被调用),并抛出一个 InvalidOperationException 如果它是空的(因为在空列表上调用 First() 是无效的)。

MyList.FirstOrDefault() 将抛出一个 ArgumentNullException 如果 MyList 为 null(因为你不能用 null 调用 FirstOrDefault),并且 return null (或类型的默认值(如果它是值类型)如果列表为空。

要处理这两种情况(MyList 为空,MyList 为空),您可以这样做:

MyList?.FirstOrDefault()

这两行根本不等价。

如果 MyList 不包含任何元素,第一个将抛出,但如果它为空则不会。

如果 MyList 为 null,第二个将抛出,但如果它不包含任何元素则不会。