ฉันมักจะใช้ตัวดำเนินการเผยแพร่ค่าว่างในโค้ดของฉันเพราะมันทำให้ฉันมีโค้ดที่อ่านได้ง่ายขึ้นโดยเฉพาะในการสืบค้นแบบยาวฉันไม่ต้องตรวจสอบค่า 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
ถูกประเมินหนึ่งครั้งด้วยตัวดำเนินการเผยแพร่ค่าว่างและสองครั้งโดยใช้เงื่อนไขดังนั้นการแปลจะไม่ถูกต้องในทุกกรณี