Tôi đang sử dụng int
làm ví dụ, nhưng điều này áp dụng cho bất kỳ loại giá trị trong Net.Net 2+: tại sao nếu (1 == null) không còn ném ngoại lệ trình biên dịch?
Trong Net 1 sau đây sẽ ném một trình biên dịch ngoại lệ:
int i = SomeFunctionThatReturnsInt();
if(i == null) //compiler exception here
Bây giờ (trong Net 2 hoặc 3.5) ngoại lệ đó đã biến mất.
Tôi biết tại sao điều này là:
int? j = null; //nullable int
if(i == j) //this shouldn't throw an exception
Vấn đề là bây giờ bởi vì int?
là nullable và int
có một diễn viên tiềm ẩn để int?
. Cú pháp trên là ma thuật trình biên dịch. Thực sự chúng tôi đang thực hiện:
Nullable<int> j = null; //nullable int
//compiler is smart enough to do this
if((Nullable<int>) i == j)
//and not this
if(i == (int) j)
Vì vậy, bây giờ, khi chúng ta làm i == null
chúng tôi nhận được:
if((Nullable<int>) i == null)
Cho rằng C# đang làm biên dịch logic để tính toán này anyway lý do tại sao nó không thể là thông minh đủ để không làm điều đó khi giao dịch với các giá trị tuyệt đối như null
?
Trình biên dịch chính xác phát hiện ra rằng nó không bao giờ đúng, giống như khi bạn đã thực hiện 1 == 2. Đó là đủ thông minh để biết rằng int có thể được ngầm đúc đến int? và đó int? có thể được so sánh với null. Tôi nghi ngờ đủ thông minh của người tối ưu hóa để loại bỏ toàn bộ khối. – Keith