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

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

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

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

Другие вопросы по тегам