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

时间:2015-03-05 14:21:06

标签: c# .net compiler-errors c#-6.0 null-propagation-operator

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

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

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#什么也不做,只是抛出一个编译错误?

1 个答案:

答案 0 :(得分:63)

这很复杂,因为表达式lambda(与委托lambdas不同)是由现有的LINQ提供程序解释的,它们还不支持null传播。

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

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

您可以深入了解提供3种解决方案的相关discussion on CodePlexNullPropagationExpressionConditionalExpression&混合动力