switch文のフォールスルー禁止エラーの原因と直し方
C#のswitch文はCやJavaと違い、暗黙のフォールスルーを認めません。各caseの終わり方に明示的な文が必要です。
エラーメッセージの読み方
Program.cs(5,13): error CS0163: Control cannot fall through from one case label ('case 1:') to another
Program.cs- ファイル名
5- 行番号
13- 列番号 — この位置でコンパイラが解析に失敗しました
CS0163- エラーコード — 検索するとMicrosoftの解説ページが見つかります
Control cannot fall through from one case label ('case 1:') to another- 内容 — 期待していたもの、または受け付けられなかったもの
このエラーが出る典型パターン
パターン1
1 class Program { 2 static void Main(string[] args) { 3 int n = 1; 4 switch (n) { 5 case 1: 6 System.Console.WriteLine("one"); 7 ^ 8 case 2: 9 System.Console.WriteLine("two"); 10 break; 11 } 12 } 13 }
Program.cs(5,13): error CS0163: Control cannot fall through from one case label ('case 1:') to another
C#はCやJavaと違い、暗黙のフォールスルーを認めません。各caseは明示的にbreak(またはreturn等)で終える必要があります。
直し方: (空) を break; にします。
広告
広告スロット(未設定)
パターン2
1 class Program { 2 static void Main(string[] args) { 3 string color = "red"; 4 switch (color) { 5 case "red": 6 System.Console.WriteLine("stop"); 7 ^ 8 case "green": 9 System.Console.WriteLine("go"); 10 break; 11 } 12 } 13 }
Program.cs(5,13): error CS0163: Control cannot fall through from one case label ('case "red":') to another
文字列のswitchでも規則は同じです。空のcaseにもbreakが必要です。
直し方: (空) を break; にします。
パターン3
1 class Program { 2 static void Main(string[] args) { 3 int score = 2; 4 switch (score) { 5 case 1: 6 System.Console.WriteLine("low"); 7 break; 8 case 2: 9 System.Console.WriteLine("mid"); 10 ^ 11 case 3: 12 System.Console.WriteLine("high"); 13 break; 14 } 15 } 16 }
Program.cs(8,13): error CS0163: Control cannot fall through from one case label ('case 2:') to another
2番目のcaseにもbreakが要ります。どのcaseも独立して終える必要があります。
直し方: (空) を break; にします。
パターン4
1 class Program { 2 static void Main(string[] args) { 3 int day = 1; 4 switch (day) { 5 case 1: 6 System.Console.WriteLine("Mon"); 7 ^ 8 case 2: 9 System.Console.WriteLine("Tue"); 10 break; 11 } 12 } 13 }
Program.cs(5,13): error CS0163: Control cannot fall through from one case label ('case 1:') to another
C#は暗黙のフォールスルーを認めません。各caseは明示的にbreakで終える必要があります。
直し方: (空) を break; にします。
パターン5
1 class Program { 2 static void Main(string[] args) { 3 int mode = 1; 4 switch (mode) { 5 case 1: 6 System.Console.WriteLine("start"); 7 ^ 8 case 2: 9 System.Console.WriteLine("run"); 10 break; 11 } 12 } 13 }
Program.cs(5,13): error CS0163: Control cannot fall through from one case label ('case 1:') to another
空のcaseにもbreakが必要です。どのcaseも独立して終える必要があります。
直し方: (空) を break; にします。
よくある誤解
CやJavaと違い、C#のswitch文は前のcaseの処理が次のcaseに流れ落ちることを許しません。空のcaseにもbreakなどの脱出文が必要です。
実務での勘所
C#の設計陣は、CやJavaのフォールスルーが「意図した省略」なのか「単なる書き忘れ」なのかをコード上で区別できないことを問題視し、既定でフォールスルーを禁止する設計を選びました。それでもどうしても次のcaseへ処理を続けたい場合は、breakの代わりにgoto case 値;と明示的に書くことで、意図的なフォールスルーだと分かる形で実現できます。暗黙に流れ落ちる言語と違い、C#では「次のcaseに進む」という操作自体が常に目に見える形でコードに残ります。