Я часто использую в своем коде оператор распространения null, потому что он дает мне более читаемый код, особенно в длинных запросах, мне не нужно проверять на null каждый используемый класс.
Следующий код вызывает ошибку компиляции, что мы не можем использовать оператор распространения null в лямбда.
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 # ничего не делает и просто выдает ошибку компилятора?
c#
.net
compiler-errors
c#-6.0
null-propagation-operator
Мохсен Саркар
источник
источник
Foo?.Bar
не эквивалентно,Foo != null ? Foo.Bar : null
потому чтоFoo
вычисляется один раз с помощью оператора распространения нуля и дважды с условным условием, поэтому перевод будет правильным во всех случаях.var q = from c in Categories join p in Products on c equals p.Category into ps from p in ps.DefaultIfEmpty() select new { Category = c, ProductName = (p?.ProductName)??"(No products)"};
вместо того, чтобы писать,ProductName = (p == null) ? "(No products)" : p.ProductName
потому что EF в настоящее время не поддерживает?.
оператор.Ответы:
Это сложно, поскольку лямбда-выражения дерева выражений (в отличие от лямбда-выражений-делегатов) интерпретируются уже существующими поставщиками LINQ, которые еще не поддерживают распространение NULL.
Преобразование в условное выражение не всегда является точным, поскольку существует несколько оценок, в то время как с
?.
использованием только одной оценки, например:Вы можете углубиться в соответствующей дискуссии на CodePlex , где предлагаются 3 решения:
NullPropagationExpression
,ConditionalExpression
и гибридисточник
Expression
том, чтобы иметь возможность семантически представлять все выражения C # в виде кода. Он не предназначен для использования в качестве небольшого подмножества языка.