我经常在我的代码中使用空传播运算符,因为它为我提供了更具可读性的代码,特别是在长查询中,我不必对每个使用的类进行空检查。

下面的代码抛出一个编译错误,我们不能在 lambda 中使用空传播运算符。

var cnt = humans.AsQueryable().Count(a => a.House?[0].Price == 5000);

错误 :



如果真的不能做任何其他事情,C# 可以很容易地将上面的代码转换为下面的代码!
var cnt = humans.AsQueryable().Count(a => a.House != null && a.House[0].Price == 5000);

我很好奇为什么 C# 什么都不做,只是抛出一个编译器错误?

最佳答案

这很复杂,因为表达式树 lambda(与委托(delegate) lambda 不同)由尚不支持空值传播的现有 LINQ 提供程序解释。

转换为条件表达式并不总是准确的,因为有多个评估,而 ?. 只有一个评估,例如:

customer.Where(a => c.Increment()?.Name) // Written by the user
customer.Where(a => c.Increment() == null ? null : c.Increment().Name) // Incorrectly interpreted by an old LINQ provider

您可以在相关的 discussion on CodePlex 中更深入,其中提供了 3 种解决方案: NullPropagationExpressionConditionalExpression 和混合

关于c# - 为什么我不能在 lambda 表达式中使用空传播运算符?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28880025/

10-13 04:06