Code Fix

初級

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に進む」という操作自体が常に目に見える形でコードに残ります。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)