Bên trong một switchcâu lệnh so khớp mẫu sử dụng một casekiể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ị nullkhô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 someStringkhông có tác dụng trong cả hai ví dụ.
Các varloạ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 defaulttrường hợp đây là mã chết. Các case var osẽ 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 đó defaultsẽ 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 defaultcá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 defaultsẽ không bao giờ bị đánh (ngay cả đối với boolgiá 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.
olà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 xcư xử khác biệt so vớivar xngay cả khixđang gõ (bởi trình biên dịch) nhưstring