我经常在代码中使用null传播运算符,因为它为我提供了更具可读性的代码,尤其是在长查询中,我不必对使用的每个类进行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#什么都不做,只是抛出编译器错误?
请注意,如果将其代码用于EF,则有可能您真的不需要null传播运算符,因为当查询转换为SQL调用时,SQL不会抛出null :-)
—
xanatos
注意:因为EF当前不支持运算符,所以写
—
马特
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
?.
Foo?.Bar
不等价,Foo != null ? Foo.Bar : null
因为Foo
使用null传播运算符对它进行了一次评估,使用条件条件进行了两次评估,因此转换并非在所有情况下都是正确的。