Почему я не могу использовать нулевой оператор распространения в лямбда-выражениях?
Я часто использую нуль-распространяющий оператор в своем коде, потому что он дает мне более читаемый код, особенно в длинных запросах, и мне не нужно проверять ноль каждый отдельный класс, который используется.
Следующий код выдает ошибку компиляции, что мы не можем использовать нулевой распространяющий оператор в лямбда-выражении.
var cnt = humans.AsQueryable().Count(a => a.House?[0].Price == 5000);
Ошибка:
Ошибка CS8072 Лямбда дерева выражений может не содержать оператора распространения с нулевым значением.
C# Может легко перевести приведенный выше код в код для следующего кода, если на самом деле ничего не может сделать!
var cnt = humans.AsQueryable().Count(a => a.House != null && a.House[0].Price == 5000);
Мне любопытно, почему C# ничего не делает и просто выдает ошибку компилятора?
1 ответ
Это сложно, поскольку лямбда-выражения дерева выражений (в отличие от лямбда-делегатов) интерпретируются уже существующими поставщиками 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
& гибрид