この記事では、コンパイラの次のエラーと警告について説明します。
次のエラーは、周囲の制御フローと一致しない方法で break、 continue、 goto、または return ステートメントを使用すると発生します。
- CS0126: 'type' に変換できる型のオブジェクトが必要です
- CS0127: 'method' は void を返すので、return キーワードの後にオブジェクト式を続けてはなりません
- CS0139: ループ を囲む必要はありません。ループを中断または続行する必要はありません
- CS0153: goto ケースは switch ステートメント内でのみ有効です
- CS0159: goto ステートメントのスコープ内にそのようなラベル 'label' がありません
- CS0161: 'method': すべてのコード パスが値を返すわけではありません
- CS0163: 制御が 1 つの case ラベル ('label') から別の case ラベルへフォール スルーすることはできません
- CS9393: ラベル 'label' 付きの break で抜けることができる、囲んでいるループまたは switch ステートメントがありません
- CS9394: 'label' というラベルの付いた、continue 先となる外側のループがありません
次の警告は、 goto case ステートメントが変換を必要とする値を対象とする場合に発生します。
- CS0469: 'goto case' 値は型 'type' に暗黙的に変換できません
ターゲットを中断して続行する
- CS0139: ループ を囲む必要はありません。ループを中断または続行する必要はありません
- CS9393: ループ または switch ステートメントを区切るラベル 'label' を含まない
- CS9394: continue 先となる、ラベル 'label' の付いた外側のループがありません
break ステートメントは、最も近い外側のループまたはswitchステートメントから制御を転送し、continue ステートメントは、最も近い外側のループの次の反復を開始します。 コンパイラは、そのターゲットが見つからない場合にこれらの診断を報告します。
これらのエラーを解決するには:
-
break、continue、while、またはdoループ内にforまたはforeachステートメントを配置します。breakステートメントは、switchセクションにも表示できます。 これらのステートメントのいずれかの中に入れ子になっていない単独のbreakまたはcontinueには、ジャンプ先がありません (CS0139)。 - ラベル付きの
break(break label;) を記述する場合は、外側のループまたはswitchステートメントに同じラベルを適用します。 ラベルには、switchステートメント (break) を含むループまたはに名前を付ける必要があります。 - ラベル付きの
continue(continue label;) を記述するときは、外側のループに同じラベルを適用します。 ラベル付きのcontinueはループのみを対象にでき、switchステートメントは対象にできません。これは、continueが次のループ反復を開始するためです(CS9394)。
これらのステートメントの詳細については、ジャンプ ステートメントに関する記事の 「 break ステートメント 」および 「 continue ステートメント 」を参照してください。
Goto ステートメントのターゲット
- CS0153: goto ケースは switch ステートメント内でのみ有効です
- CS0159: goto ステートメントのスコープ内にそのようなラベル 'label' がありません
- CS0469: 'goto case' 値は型 'type' に暗黙的に変換できません
goto ステートメントは、ラベル付きステートメント、case ラベル、または default ステートメントのswitch ラベルに制御を転送します。 コンパイラは、ターゲット ラベルが存在しないか、 goto ステートメントから到達できない場合に、これらの診断を報告します。
これらのエラーを解決するには:
-
goto caseステートメント内でのみ、goto defaultとswitchを使用します。 どちらの形式も、外側のswitchステートメントのセクションに名前を付けるので、外側には意味がありません (CS0153)。 -
gotoステートメント内の名前と一致するラベルを追加し、そのラベルがgotoステートメントのスコープ内にあることを確認します。gotoステートメントは入れ子になったブロックにジャンプできません。goto caseには、同じcaseステートメント (switch) に一致する ラベルが必要です。 -
goto case値に、switch管理式と同じ型を指定するか、暗黙的な変換が存在するように明示的なキャストを追加します。 たとえば、goto case (char)127;がgoto case 127;値 (switch) を管理する場合は、charではなくを使用します。
gotoステートメントの詳細については、ジャンプ ステートメントに関する記事のgotoステートメントを参照してください。
goto caseとgoto defaultの詳細については、selection ステートメントの記事のswitchステートメントを参照してください。
セクション終了の切り替え
- CS0163: 1 つの case ラベル ('label') から別の case ラベルへ制御をフォールスルーすることはできません
C# では、コントロールを 1 つの switch セクションから次のセクションにフォールスルーすることはできません。
switch ステートメントに複数のセクションが含まれている場合は、最後のセクションを含め、各セクションを明示的に終了する必要があります。
このエラーを解決するには、switch、break、return、goto case、goto defaultなどのジャンプ ステートメントを含む各throw セクションを終了します。 複数の値に対して同じステートメントを実行するには、 case ラベルの間にステートメントを含めずにスタックします。その配置はフォールスルーされません。 あるセクションを別のセクションに進める場合は、 goto case または goto default を使用して、次のセクションに明示的に名前を付けます (CS0163)。
switch ステートメントの詳細については、選択ステートメントに関する記事の switch ステートメント を参照してください。
throw ステートメントの詳細については、例外処理ステートメントに関する記事の「throw ステートメント」を参照してください。
ステートメント値を返す
- CS0126: 'type' に変換できる型のオブジェクトが必要です
- CS0127: 'method' は void を返すので、return キーワードの後にオブジェクト式を続けてはなりません
- CS0161: 'method': すべてのコード パスが値を返すわけではありません
return ステートメントは、包含メンバーの実行を終了し、呼び出し元に制御を返します。
return ステートメントは値を返すこともできます。
これらのエラーを解決するには:
-
return以外の戻り値の型を持つメンバーの各voidステートメントに値を指定し、その値がその戻り値の型に変換できることを確認します。getアクセサーと値を返すメソッドの両方に、値を含むreturnステートメントが必要です (CS0126)。 -
returnアクセサーやvoid戻り値の型を持つメソッドなど、setを返すメンバー内の任意のvoidステートメントから値を削除します。 単独のreturn;文を使用して途中で終了します (CS0127)。 - 値を返すメンバーのすべてのコード パスが、
returnステートメントまたはthrowステートメントで終わることを確認します。 メンバーは、すべての条件ステートメントの各分岐が値を返すとき、または最終的なreturnステートメントが条件付きロジック (CS0161) に従うときに、すべてのコード パスを返します。
return型またはTask型を返す非同期メソッドおよびメンバーのValueTaskステートメントの詳細については、「async および await に関連するエラーと警告」を参照してください。 反復子の return ステートメントの詳細については、「反復子に 関連するエラーと警告」を参照してください。
returnステートメントの詳細については、ジャンプ ステートメントに関する記事のreturnステートメントを参照してください。
C# 言語仕様
詳細については、C# 言語仕様の Jump ステートメント のセクションを参照してください。
こちらも参照ください
.NET