使用null传播运算符一段时间后,我偶然发现了一个用于选择单个项目的linq子句。有没有理由(表现,最佳实践)不使用?。第一()?
iex -S mix
或
MyList?.First();
答案 0 :(得分:11)
这不是表现或最佳实践的问题;他们只是不做同样的事情。
如果MyList?.First()
为空, MyList
将返回null(由于null传播运算符,甚至不会调用First()
),如果它为空则抛出InvalidOperationException
(因为在空列表上调用First()
无效)。
MyList.FirstOrDefault()
为null(因为您无法使用null调用ArgumentNullException
), MyList
将抛出FirstOrDefault
,并返回null(或类型的默认值,如果如果列表为空,则为值类型。
要处理这两种情况(MyList
为空,MyList
为空),您可以执行此操作:
MyList?.FirstOrDefault()
答案 1 :(得分:2)
这两行根本不相同。
如果MyList
不包含任何元素,则第一个将抛出,但如果它不为null,则抛出第一个。
如果MyList
为空,则第二个将抛出,但如果它不包含元素则不抛出。