【发布时间】:2023-03-03 03:43:01
【问题描述】:
我经常在我的代码中使用 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# 什么都不做,只是抛出编译器错误?
【问题讨论】:
-
Foo?.Bar不等于Foo != null ? Foo.Bar : null,因为Foo使用空传播运算符计算一次,使用条件计算两次,因此翻译并非在所有情况下都是正确的。 -
请注意,如果它的代码用于 EF,则您可能并不真正需要空传播运算符,因为当查询转换为 SQL 调用时,SQL 不会抛出空值:- )
-
注意:写
var q = from c in Categories join p in Products on c equals p.Category into ps from p in ps.DefaultIfEmpty() select new { Category = c, ProductName = (p?.ProductName)??"(No products)"};而不是写ProductName = (p == null) ? "(No products)" : p.ProductName也很有用,因为EF目前不支持?.运算符。
标签: c# .net compiler-errors c#-6.0 null-propagation-operator