Vấn đề ở đây là cách trình biên dịch xử lý "chắc chắn được gán khi đúng". !
đảo ngược; == false
thì không. Vì vậy, đối mã:
if (!(obj is int i))
return;
System.Console.WriteLine(i);
Trình biên dịch có thể suy ra rằng nếu obj is int i
là false, !
đảo ngược đó, do đó return
sẽ xảy ra nếu nó không phải là một int
. Do đó, i
có thể được phép "rò rỉ" vào mã tiếp theo một cách an toàn.
Tuy nhiên, các quy tắc tương tự không áp dụng cho == false
. Trong khi ngữ nghĩa giống hệt với một người đọc mã nguồn, trình biên dịch xử lý !
và == false
là những thứ rất khác nhau. Vì vậy, đối với:
if (false == (obj is int i))
baulks trình biên dịch và xem nó không thể biết trạng thái gán i
, do đó là lỗi.
Để thảo luận về điều này, vui lòng xem Incorrect "Use of unassigned local variable" for (x is T y) == false
.
Các đạo đức của câu chuyện: tránh so với false
và sử dụng !
khi sử dụng C# mẫu.
EDIT
Cần lưu ý rằng == false
không phải là một trường hợp đặc biệt ở đây. Bất kỳ việc sử dụng nào của ==
sẽ loại bỏ khả năng của trình biên dịch để xác định "chắc chắn được gán khi đúng". Ví dụ, đoạn mã sau biên dịch:
object x = 1;
if (!(x is bool y))
return 0;
var z = y;
Nhưng thêm một == true
và nó không còn thực hiện:
object x = 1;
if (!(x is bool y == true))
return 0;
var z = y; // error: use of an unassigned variable
EDIT2
Ngẫu nhiên, cho bất cứ ai sử dụng if (expression == false)
vì họ thấy if (!expression)
khó đọc, bạn có thể muốn biết rằng the syntax, if !(expression)
is being considered for C# 8.
có vẻ như tôi nằm ngoài phạm vi đối với trường hợp cạnh của M1? –
@ Aominè Tôi có thể thấy nó trong VS 15.2 (VS-> help-> about) ... Bạn sử dụng cái gì? –
@PatrickArtner Rõ ràng là không. Nếu 'i' nằm ngoài phạm vi, lỗi sẽ không nói" biến cục bộ chưa được gán ". Bạn chỉ có thể nhận được lỗi đó cho các biến nằm trong phạm vi. – hvd