Thông số kỹ thuật (§7.14) nói rằng đối với điều kiện cũ pression b ? x : y
, có ba khả năng, hoặc là x
và y
cả hai đều có một loại và nhất định điều kiện tốt được đáp ứng, chỉ là một trong x
và y
có một loại và nhất định điều kiện tốt được đáp ứng, hoặc một biên dịch lỗi thời gian xảy ra. Ở đây, "một số điều kiện tốt" có nghĩa là một số chuyển đổi nhất định có thể thực hiện được, chúng tôi sẽ đưa vào các chi tiết bên dưới.
Bây giờ, chúng ta hãy chuyển sang phần Gecman của spec:
Nếu chỉ một trong x
và y
có một loại, và cả hai x
và y
đang ngầm chuyển đổi thành kiểu đó, thì đó là loại của biểu thức có điều kiện.
Vấn đề ở đây là trong
int? number = true ? 5 : null;
chỉ một trong những kết quả có điều kiện có một kiểu. Dưới đây là một x
int
theo nghĩa đen, và y
là null
mà không không có một loại và null
không phải là mặc nhiên chuyển đổi thành một int
. Do đó, "điều kiện tốt nhất định" không được đáp ứng và xảy ra lỗi biên dịch.
Có là hai cách xung quanh này:
int? number = true ? (int?)5 : null;
Ở đây chúng ta vẫn còn trong trường hợp chỉ có một trong x
và y
có một kiểu. Lưu ý rằng null
vẫn còn không có loại nào nhưng trình biên dịch sẽ không gặp bất kỳ vấn đề nào với điều này vì (int?)5
và null
đều được chuyển đổi hoàn toàn thành int?
(§6.1.4 và §6.1.5).
Một cách khác là rõ ràng:
int? number = true ? 5 : (int?)null;
nhưng bây giờ chúng ta phải đọc một khác nhau khoản trong spec để hiểu tại sao điều này không quan trọng:
Nếu x
đã gõ X
và y
có loại Y
rồi
Nếu chuyển đổi tiềm ẩn (§6.1) tồn tại từ X
đến Y
, nhưng không phải từ Y
đến X
, thì Y
là loại biểu thức có điều kiện.
Nếu một chuyển đổi ngầm (§6.1) tồn tại Y
-X
, nhưng không X
-Y
, sau đó X
là kiểu của biểu thức điều kiện.
Nếu không, không thể xác định loại biểu thức nào và xảy ra lỗi biên dịch.
Đây x
là loại int
và y
là loại int?
. Không có chuyển đổi tiềm ẩn từ int?
đến int
, nhưng có một chuyển đổi tiềm ẩn từ int
đến int?
do đó loại biểu thức là int?
.
: Lưu ý thêm rằng loại bên trái được bỏ qua trong việc xác định loại biểu thức có điều kiện, một nguồn gây nhầm lẫn phổ biến ở đây.
Giải thích và ví dụ tốt nhất ... [http://stackoverflow.com/questions/858080/nullable-types-and-the-ternary-operator-why-is-10-null-forbidden?answertab=active#tab ] (http://stackoverflow.com/questions/858080/nullable-types-and-the-ternary-operator-why-is-10-null-forbidden?answertab=active#tab-top) -top –