Saya sering menggunakan operator penyebaran null dalam kode saya karena memberi saya kode yang lebih mudah dibaca, khususnya dalam kueri yang panjang, saya tidak perlu memeriksa null setiap kelas yang digunakan.
Kode berikut memunculkan kesalahan kompilasi bahwa kita tidak dapat menggunakan operator propagasi null di lambda.
var cnt = humans.AsQueryable().Count(a => a.House?[0].Price == 5000);
Kesalahannya:
Kesalahan CS8072 Pohon ekspresi lambda mungkin tidak berisi operator menyebarkan null.
C # Dapat dengan mudah menerjemahkan kode di atas ke kode ke kode berikut jika benar-benar tidak dapat melakukan hal lain!
var cnt = humans.AsQueryable().Count(a => a.House != null && a.House[0].Price == 5000);
Saya penasaran mengapa C # tidak melakukan apa-apa dan hanya menampilkan kesalahan kompiler?
c#
.net
compiler-errors
c#-6.0
null-propagation-operator
Mohsen Sarkar
sumber
sumber
Foo?.Bar
tidak sama denganFoo != null ? Foo.Bar : null
karenaFoo
dievaluasi sekali dengan operator penyebar null, dan dua kali dengan kondisional, sehingga terjemahan tidak akan benar di semua kasus.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)"};
daripada harus menulisProductName = (p == null) ? "(No products)" : p.ProductName
karena EF saat ini tidak mendukung?.
operator.Jawaban:
Ini rumit karena lambda pohon ekspresi (tidak seperti lambda delegasi) diinterpretasikan oleh penyedia LINQ yang sudah ada yang belum mendukung penyebaran null.
Mengonversi ke ekspresi kondisional tidak selalu akurat karena ada beberapa evaluasi sementara
?.
hanya ada satu evaluasi misalnya:Anda dapat pergi lebih dalam terkait pembahasan CodePlex mana 3 solusi yang ditawarkan:
NullPropagationExpression
,ConditionalExpression
& hibridasumber
Expression
adalah untuk dapat mewakili semua C # ekspresi semantik sebagai kode. Ini tidak dirancang hanya untuk sebagian kecil dari bahasa.