为什么我不能在 lambda 表达式中使用 null 传播运算符?

Why can't I use the null propagation operator in lambda expressions?

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

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

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

错误:

Error CS8072 An expression tree lambda may not contain a null propagating operator.

如果实在不行的话,C# 可以很容易地将上面的代码转换成下面的代码!

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

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

这很复杂,因为表达式树 lambda(与委托 lambda 不同)由尚不支持 null 传播的现有 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 和混合