web-dev-qa-db-ja.com

ラムダ式でヌル伝播演算子を使用できないのはなぜですか?

特に、使用されるすべてのクラスを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#が何もせず、単にコンパイラエラーをスローするのか興味がありますか?

93
Mohsen Sarkar

式ツリーのラムダ(デリゲートラムダとは異なり)は、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つのソリューションが提供されています:NullPropagationExpressionConditionalExpressionおよびハイブリッド

62
i3arnon