Bên trong một switch
câu lệnh so khớp mẫu sử dụng một case
kiểu rõ ràng sẽ hỏi xem giá trị được đề cập thuộc kiểu cụ thể hay kiểu dẫn xuất. Nó tương đương chính xác vớiis
switch (someString) {
case string s:
}
if (someString is string)
Giá trị null
không có kiểu và do đó không thỏa mãn một trong hai điều kiện trên. Kiểu tĩnh someString
không có tác dụng trong cả hai ví dụ.
Các var
loại mặc dù trong mô hình phù hợp với hoạt động như một thẻ hoang dã và sẽ phù hợp với bất kỳ giá trị bao gồm null
.
Các default
trường hợp đây là mã chết. Các case var o
sẽ phù hợp với bất kỳ giá trị, null hoặc không null. Một trường hợp không mặc định luôn thắng một trường hợp mặc định do đó default
sẽ không bao giờ được đánh. Nếu bạn nhìn vào IL, bạn sẽ thấy nó thậm chí không được phát ra.
Trong nháy mắt, có vẻ kỳ lạ khi điều này biên dịch mà không có bất kỳ cảnh báo nào (chắc chắn đã khiến tôi thất vọng). Nhưng điều này phù hợp với hành vi C # quay trở lại 1.0. Trình biên dịch cho phép default
các trường hợp ngay cả khi nó có thể chứng minh rằng nó sẽ không bao giờ bị tấn công. Hãy xem xét như một ví dụ sau:
bool b = ...;
switch (b) {
case true: ...
case false: ...
default: ...
}
Ở đây default
sẽ không bao giờ bị đánh (ngay cả đối với bool
giá trị đó không phải là 1 hoặc 0). Tuy nhiên, C # đã cho phép điều này kể từ 1.0 mà không có cảnh báo. Sự khớp mô hình chỉ phù hợp với hành vi này ở đây.
o
làstring
(khẳng định với Generics - tức làFoo(o)
nơiFoo<T>(T template) => typeof(T).Name
) - đó là một trường hợp rất thú vị nơistring x
cư xử khác biệt so vớivar x
ngay cả khix
đang gõ (bởi trình biên dịch) nhưstring