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

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

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

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

Ошибка:

Ошибка CS8072 Дерево выражений lambda не может содержать нулевой оператор распространения.

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

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

Мне интересно, почему С# ничего не делает и просто бросает ошибку компилятора?

Ответ 1

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