我经常在我的代码中使用空值传播运算符,因为它让我的代码更易读,特别是在长查询中,我不必对每个使用的类进行 null 检查。
以下代码会抛出编译错误,因为我们无法在 Lambda 中使用空值传播运算符。
var cnt = humans.AsQueryable().Count(a => a.House?[0].Price == 5000);
错误:
Error 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
只被评估一次,而使用条件运算符时Foo
被评估了两次,因此直接翻译可能在某些情况下不正确。 - Lucas Trzesniewskivar 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 目前不支持?.
运算符。 - Matt