| 版本 | 特性 | 範例 |
|---|---|---|
| C# 1.0 | 常數模式 | case 1: case 2: |
| C# 7.0 | 型別模式、when 守衛 | case int n when n > 0: |
| C# 8.0 | switch 運算式、屬性/元組/位置模式 | return shape switch { Circle c => c.Radius, _ => 0 }; |
| C# 9.0 | 關係/邏輯/非模式 | case > 0: case <= 100 and >= 0: |
// 輸入:年(1-9999)、月(1-12)、日(1-31)
// 輸出:0=週日, 1=週一, ..., 6=週六
public static int DayOfWeek(int y, int m, int d) {
if (m < 3) { m += 12; y--; }
int week = (d + 2*m + 3*(m+1)/5 + y + y/4 - y/100 + y/400) % 7;
return (week + 7) % 7; // 確保非負
}
// switch 表達式對應星期名稱 (C# 8+)
public static string WeekDayName(int y, int m, int d) => DayOfWeek(y, m, d) switch {
0 => "星期日",
1 => "星期一",
2 => "星期二",
3 => "星期三",
4 => "星期四",
5 => "星期五",
6 => "星期六",
_ => throw new ArgumentOutOfRangeException()
};
// 傳統陳述式
switch (value) {
case 1: case 2: DoSomething(); break;
case int n when n > 10: DoLarge(); break;
default: DoDefault(); break;
}
// 運算式形式 (有回傳值)
var result = value switch {
1 or 2 => "Small",
int n when n > 10 => "Large",
_ => "Other"
};
// 型別模式
object obj = "hello";
string desc = obj switch {
int i => $"Integer: {i}",
string s => $"String({s.Length}): {s}",
null => "Null",
_ => "Unknown"
};
// 元組模式
(string a, string b) = ("yes", "no");
var logic = (a, b) switch {
("yes", "yes") => "Both yes",
("yes", "no") => "First only",
_ => "Other"
};
// 關係模式 (C# 9+)
int score = 85;
string grade = score switch {
>= 90 => "A",
>= 80 => "B",
>= 70 => "C",
>= 60 => "D",
_ => "F"
};
// 非模式
string input = "test";
bool valid = input switch {
not null and not "" => true,
_ => false
};
{ var x = ...; }if-else 可讀性較佳switch 運算式強制完整處理 (編譯器警告遺漏 case)

