Почему я не могу использовать нулевой оператор распространения в лямбда-выражениях?
Я часто использую нулевой оператор распространения в моем коде, потому что он дает мне более читаемый код, особенно в длинных запросах. Мне не нужно проверять каждый отдельный класс, который используется.
Следующий код генерирует ошибку компиляции, в которой мы не можем использовать оператор, распространяющий нуль, в 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
и гибридный