Tôi thường sử dụng toán tử lan truyền null trong mã của mình vì nó mang lại cho tôi mã dễ đọc hơn, đặc biệt trong các truy vấn dài, tôi không phải kiểm tra null từng lớp đơn lẻ được sử dụng.
Đoạn mã sau đưa ra một lỗi biên dịch mà chúng tôi không thể sử dụng toán tử lan truyền null trong lambda.
var cnt = humans.AsQueryable().Count(a => a.House?[0].Price == 5000);
Lỗi :
Lỗi CS8072 Một lambda cây biểu thức có thể không chứa toán tử lan truyền rỗng.
C # có thể dễ dàng dịch mã ở trên sang mã sang mã sau nếu thực sự không thể làm gì khác!
var cnt = humans.AsQueryable().Count(a => a.House != null && a.House[0].Price == 5000);
Tôi tò mò tại sao C # không làm gì cả và chỉ đơn giản là ném một lỗi trình biên dịch?
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)"};
thay vì phải viết ProductName = (p == null) ? "(No products)" : p.ProductName
vì EF hiện không hỗ trợ ?.
toán tử.
Foo?.Bar
không tương đương vớiFoo != null ? Foo.Bar : null
vìFoo
được đánh giá một lần với toán tử lan truyền null và hai lần với điều kiện, vì vậy bản dịch sẽ không chính xác trong mọi trường hợp.