为什么我不能在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: NullPropagationExpression
, ConditionalExpression
NullPropagationExpression
和混合