2013-05-22 30 views

Trả lời

17

Loại bar vẫn là int?, và không có chuyển đổi ngầm từ int? để int.

Điều kiện không thay đổi tính hợp lệ của mã sau này. Điều này cũng đúng đối với các phôi khác:

object x = ...; 
if (x is string) 
{ 
    string y = x; // This is still invalid 
    string z = (string) x; // This is fine 
} 

Trình biên dịch hiếm khi sử dụng kết quả của một đoạn mã để ảnh hưởng đến giá trị của mã khác. Một ví dụ khác:

bool condition = ...; 
string x; 
if (condition) 
{ 
    x = "yes"; 
} 
if (!condition) 
{ 
    x = "no"; 
} 
Console.WriteLine(x); // Invalid 

Dòng cuối cùng không hợp lệ vì x vẫn chưa được gán rõ ràng. Chúng tôi biết rằng bất kỳ giá trị nào của x, chúng tôi sẽ nhập một trong số các đối tượng tuyên bố if đó ... nhưng trình biên dịch không cố gắng tìm ra điều này.

Mặc dù điều này có vẻ câm, nó làm cho quy tắc ngôn ngữ đơn giản hơn đáng kể.

+0

Tôi nghĩ rằng câu trả lời này là thư của câu hỏi nhưng không phải là tinh thần. Tinh thần của câu hỏi là, "Tại sao toán tử chuyển đổi của' Nullable' được khai báo 'rõ ràng' hơn là' ngầm định'? " '' 'Edit:' '' Thực ra, nó trả lời tại sao. Lỗi của tôi. – Medinoc

21

So sánh chỉ nói - không phải là null, Trình biên dịch vẫn sử dụng loại để xem có thể thực hiện được việc chuyển nhượng hay không.

Sau đây sẽ biên dịch ngay cả khi không kiểm tra null.

foo = (int)bar; 
3

Trình biên dịch chỉ kiểm tra xem chương trình của bạn có đúng cú pháp hay không. Nó không quan tâm đến kiểm tra null của bạn.

Trình biên dịch thấy rằng bạn có thể mất thông tin khi gán một int? để int và do đó nó phàn nàn.

1

Hãy tưởng tượng điều này: Điều gì sẽ xảy ra nếu bạn có biến thành viên được nhập là Nullable<int>, được truy cập bởi một số chuỗi. Hãy xem mã của bạn trong những trường hợp đó.

if(foo != null) 
{ 
    // expensive operation that takes time. 
    // what if another thread as nulled foo in the meantime? 
    int bar = foo; 
} 
+0

Không phải '(int) foo' và' foo.Value' cũng không an toàn không? – Stijn

Các vấn đề liên quan