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