为什么我不能在lambdaexpression式中使用空传播操作符?

我经常在我的代码中使用空传播操作符,因为它给了我更多的可读代码,特别是在长查询中,我不必对每个使用的类都进行空检查。

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

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

错误 :

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

C#可以很容易地将上面的代码翻译成下面的代码,如果真的不能做任何事情!

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

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

因为expression式树lambdaexpression式(不像委托lambdaexpression式)被已经存在的LINQ提供者解释,而这些提供者还不支持空传播。

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

 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的相关讨论,其中提供了3种解决scheme: NullPropagationExpressionConditionalExpression NullPropagationExpression和混合