Я часто использую в своем коде оператор распространения 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 # ничего не делает и просто выдает ошибку компилятора?
Foo?.Bar
не эквивалентно,Foo != null ? Foo.Bar : null
потому чтоFoo
вычисляется один раз с помощью оператора распространения нуля и дважды с условным условием, поэтому перевод будет правильным во всех случаях.