ジャンプ ステートメントのエラーと警告を解決する

この記事では、コンパイラの次のエラーと警告について説明します。

次のエラーは、周囲の制御フローと一致しない方法で breakcontinuegoto、または 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 ステートメントは、最も近い外側のループの次の反復を開始します。 コンパイラは、そのターゲットが見つからない場合にこれらの診断を報告します。

これらのエラーを解決するには:

  • breakcontinuewhile、または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 defaultswitchを使用します。 どちらの形式も、外側の switch ステートメントのセクションに名前を付けるので、外側には意味がありません (CS0153)。
  • goto ステートメント内の名前と一致するラベルを追加し、そのラベルが goto ステートメントのスコープ内にあることを確認します。 gotoステートメントは入れ子になったブロックにジャンプできません。goto caseには、同じcase ステートメント (switch) に一致する ラベルが必要です。
  • goto case値に、switch管理式と同じ型を指定するか、暗黙的な変換が存在するように明示的なキャストを追加します。 たとえば、goto case (char)127;goto case 127;値 (switch) を管理する場合は、charではなくを使用します。

gotoステートメントの詳細については、ジャンプ ステートメントに関する記事のgotoステートメントを参照してください。 goto casegoto defaultの詳細については、selection ステートメントの記事のswitchステートメントを参照してください。

セクション終了の切り替え

  • CS0163: 1 つの case ラベル ('label') から別の case ラベルへ制御をフォールスルーすることはできません

C# では、コントロールを 1 つの switch セクションから次のセクションにフォールスルーすることはできません。 switch ステートメントに複数のセクションが含まれている場合は、最後のセクションを含め、各セクションを明示的に終了する必要があります。

このエラーを解決するには、switchbreakreturngoto casegoto 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 ステートメント のセクションを参照してください。

こちらも参照ください