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



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

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

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

错误:

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

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

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

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

这很复杂,因为表达式树lambda(与委托lambda不同)是由现有的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

您可以深入CodePlex的相关讨论,其中提供了3种解决方案:NullPropagationExpressionConditionalExpression&混合

相关内容

  • 没有找到相关文章

最新更新