111

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

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

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

错误 :

错误 CS8072 表达式树 lambda 可能不包含空传播运算符。

如果真的不能做任何其他事情,C# 可以轻松地将上面的代码转换为下面的代码!

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

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

4

1 回答 1

82

这很复杂,因为表达式树 lambdas(与委托 lambdas 不同)由尚不支持 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

您可以深入了解 CodePlex 的相关讨论NullPropagationExpression其中提供了 3 种解决方案:ConditionalExpression

于 2015-03-05T14:36:38.653 回答