Почему я не могу использовать оператор распространения 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# ничего не делает и просто выдает ошибку компилятора?

1 83

1 ответ:

это сложно, так как лямбды дерева выражений (в отличие от лямбд делегата) интерпретируются уже существующими поставщиками 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 & гибридной