Почему я не могу использовать оператор распространения null в лямбда-выражениях?

Я часто использую оператор распространения null в моем коде, потому что он дает мне более читаемый код, особенно в длинных запросах, мне не нужно проверять null каждый используемый класс.

следующий код выдает ошибку компиляции, что мы не можем использовать оператор распространения null в lambda.

var cnt = humans.AsQueryable().Count(a => a.House?[0].Price == 5000);

ошибки :

Error CS8072 дерево выражений lambda может не содержать оператора распространения null.

C# может легко переведите выше код в код в следующий код, если действительно не можете сделать ничего другого!

var cnt = humans.AsQueryable().Count(a => a.House != null && a.House[0].Price == 5000);

мне любопытно, почему C# ничего не делает и просто выдает ошибку компилятора?

1 ответов


это сложно, так как дерево выражений lambdas (в отличие от делегата lambdas) интерпретируется уже существующими поставщиками LINQ, которые еще не поддерживают распространение null.

преобразование в условное выражение не всегда точно, поскольку есть несколько оценок, а с ?. существует только одна оценка, например:

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 & гибридной