特に、使用されるすべてのクラスを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#が何もせず、単にコンパイラエラーをスローするのか興味がありますか?
式ツリーのラムダ(デリゲートラムダとは異なり)は、nullの伝播をまだサポートしていない既存のLINQプロバイダーによって解釈されるため、複雑です。
条件式への変換は、?.
たとえば、単一の評価のみがあります。
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つのソリューションが提供されています:NullPropagationExpression
、ConditionalExpression
およびハイブリッド