111

特に長いクエリでは、使用されるすべてのクラスを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# が何もせず、単にコンパイラ エラーをスローするのはなぜですか?

4

1 に答える 1

82

式ツリー ラムダ (デリゲート ラムダとは異なります) は、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

3 つのソリューションが提供されている CodePlexの関連するディスカッションでさらに深く掘り下げることができます: NullPropagationExpressionConditionalExpression& ハイブリッド

于 2015-03-05T14:36:38.653 に答える