私はコードでnull伝播演算子をよく使用します。コードが読みやすくなるためです。特に、長いクエリでは、使用されるすべてのクラスをnullチェックする必要がないためです。
次のコードは、ラムダでnull伝播演算子を使用できないコンパイルエラーをスローします。
var cnt = humans.AsQueryable().Count(a => a.House?[0].Price == 5000);
エラー :
エラーCS8072式ツリーのラムダにnullの伝播演算子を含めることはできません。
C#は、実際には他に何もできない場合、上記のコードを次のコードに簡単に変換できます。
var cnt = humans.AsQueryable().Count(a => a.House != null && a.House[0].Price == 5000);
C#が何もせず、単にコンパイラエラーをスローするのはなぜでしょうか。
EFのコードの場合、クエリがSQL呼び出しに変換されてもSQLがnullをスローしないため、null伝播演算子が実際には不要である可能性があることに注意してください:-)
—
xanatos
注意:現在、EFはオペレーターをサポートしていないため、
—
Matt
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
は、null伝播演算子で1回、条件付きで2回評価されるFoo != null ? Foo.Bar : null
ため、同等ではありませんFoo
。したがって、すべての場合で変換は正しくありません。