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

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

  • CS0126: 'type' に変換できる型のオブジェクトが必要です
  • CS0127: 'method' は void を返すので、return キーワードの後にオブジェクト式を続けてはなりません
  • CS0139: break または continue に対応するループがない
  • CS0140: ラベル 'label' が重複しています
  • CS0153: goto ケースは switch ステートメント内でのみ有効です
  • CS0157: コントロールは finally 句の本体を離れることができません
  • CS0158: ラベル 'label' は、含まれるスコープ内で同名の別のラベルを隠します
  • CS0159: goto ステートメントのスコープ内にそのようなラベル 'label' がありません
  • CS0161: 'method': すべてのコード パスが値を返すわけではありません
  • CS0162: 到達できないコードが検出されました
  • CS0163: 制御が 1 つの case ラベル ('label') から別の case ラベルへフォール スルーすることはできません
  • CS0164: このラベルは参照されていません
  • CS0469: 'goto case' 値は型 'type' に暗黙的に変換できません
  • CS8070: switch の最後の case ラベル ('label') から制御が抜けることはできません
  • CS9393: ラベルが 'label' で break に対応するループや switch ステートメントがない
  • CS9394: ラベルが 'label' で continue に対応するループがない

有効なジャンプ先を選択

  • CS0139: break または continue に対応するループがない

  • CS0153: goto ケースは switch ステートメント内でのみ有効です

  • CS0157: コントロールは finally 句の本体を離れることができません

  • CS0159: goto ステートメントのスコープ内にそのようなラベル 'label' がありません

  • CS0469: 'goto case' 値は型 'type' に暗黙的に変換できません

  • CS9393: ラベルが 'label' で break に対応するループや switch ステートメントがない

  • CS9394: ラベルが 'label' で continue に対応するループがない

  • breakをループまたはswitchステートメント内に配置し、ループ内にcontinueを配置します。 各ステートメントには、対象とするための囲み構造が必要です(CS0139)。

  • break label; のラベルを、それを囲むループまたは switch ステートメントに適用します (CS9393)。 continue label; のラベルは、switch ステートメントではなく、それを囲むループに適用します (CS9394)。

  • と switch を、その配置先 (goto default) を含む goto case ステートメント内に配置します。

  • goto ステートメントのスコープ内で名前付き宛先を定義するか、ターゲット名を修正します。 goto ステートメントは、入れ子になったブロックまたは別のメンバー (CS0159) に入ることはできません。

  • goto case の値に、switch の支配型へ暗黙的に変換可能な型を割り当てます。 たとえば、変換先が文字ケース ラベル (goto case (char)127;) の場合は、goto case 127;ではなくを使用します。

  • return、break、continue、goto ブロックから出ている finally を、そのブロックの外側に移動します。 ブロック内のジャンプは、ターゲットがブロック内に残っている場合にのみ有効です (CS0157)。

該当する制御フロー ルールについては、 Jump ステートメント と try-finally ステートメント を参照してください。

ラベルを一貫して定義および参照する

  • CS0140: ラベル 'label' が重複しています

  • CS0158: ラベル 'label' は、含まれているスコープ内の同じ名前で別のラベルをシャドウします

  • CS0164: このラベルは参照されていません

  • 同じスコープまたは入れ子になったスコープで同じ名前のラベルの名前を変更し、対応する goto ターゲットを更新します。 既存のラベルが既に目的の宛先(CS0140、CS0158)をマークしている場合は、重複するラベルを削除します。

  • ステートメントを保持したまま、未使用のラベルを削除します。 goto がそのステートメントに到達するように意図されていた場合は、代わりにそのターゲットラベルを修正します (CS0164)。

ラベルのスコープとターゲットの解決については、 goto ステートメントを参照してください。

スイッチ セクションを明示的に終了する

  • CS0163: 1 つの case ラベル ('label') から別の case ラベルへ制御をフォールスルーすることはできません
  • CS8070: control は、final case ラベル ('label') から switch の範囲外に出ることはできません

コントロールがswitch セクションの末尾に到達する可能性がある箇所には、break、return、goto case、goto default、throw などのジャンプ ステートメントを追加します。 switch が 1 つのセクションしか含まない場合でも、制御は次のセクション (CS0163) に入ったり、最後のセクション (CS8070) から抜け出したりしてはいけません。

次の例では、マークされた最後の default: および ラベルで case 1: が生成されます。 エラーを修正するには、各 switch の末尾にある break; のコメントを削除します。

switch (number)
{
    case 0:
        number++;
        break;
    case 1: // CS8070
        number = 0;
        // break;
}

switch (number)
{
    case 0:
        number++;
        break;
    default: // CS8070
        number = 0;
        // break;
}

値間でステートメントを共有するには、各値の case ラベルを、その間にステートメントを挟まずに並べます。 制御を別のセクションに明示的に転送するには、 goto case または goto defaultを使用します。

switch ステートメントおよびthrow ステートメントを参照してください。

必要な値を返す

  • CS0126: 'type' に変換できる型のオブジェクトが必要です

  • CS0127: 'method' は void を返すので、return キーワードの後にオブジェクト式を続けてはなりません

  • CS0161: 'method': すべてのコード パスが値を返すわけではありません

  • コンテナが値を必要とする場合、return の後に式を指定し、その型を必要な戻り値の型に変換可能にしてください (CS0126)。

  • メソッドやプロパティ セッター (return;) など、値を返さないメンバーでは、式なしで void を使用します。

  • 値を返すメンバーから到達可能なすべての終了パスをカバーします。 処理されていない分岐にはリターンを追加するか、分岐から結果が得られない場合は例外をスローしてください (CS0161)。

リターンのフォームと要件については、リターン ステートメントに関する説明参照してください。

到達できないコードの削除

  • CS0162: 到達できないコードが検出されました

どの制御フロー パスからも到達できない場合に、無条件ジャンプに続くステートメントを削除します。 たとえば、break; セクションで return の直後にある switch を削除します。return は既にメンバーを終了します (CS0162)。

それらのステートメントが実行されることを意図している場合は、ジャンプの前に移動するか、それらのステートメントを到達不能にしている条件またはジャンプ先を修正します。 各ステートメントが制御を移す方法については、ジャンプ ステートメントを参照してください。

C# 言語仕様

詳細については、C# 言語仕様の Jump ステートメント のセクションを参照してください。

こちらも参照ください