Fehler und Warnungen bei Sprunganweisungen beheben

Dieser Artikel behandelt die folgenden Compiler-Fehler und -Warnungen:

Die folgenden Fehler treten auf, wenn Sie eine break-, continue-, goto- oder return-Anweisung so verwenden, dass sie nicht zum umgebenden Steuerungsfluss passt:

  • CS0126: Ein Objekt eines Typs, das in "Type" wandelbar ist, ist erforderlich.
  • CS0127: Da "method" "void" zurückgibt, darf kein Rückgabeschlüsselwort gefolgt von einem Objektausdruck sein.
  • CS0139: Keine einschließende Schleife, die mit break oder continue verlassen oder fortgesetzt werden kann
  • CS0153: Eine goto-case-Anweisung ist nur in einer switch-Anweisung gültig
  • CS0159: Keine solche Bezeichnung "label" im Rahmen der Goto-Anweisung
  • CS0161: 'method': Nicht alle Codepfade geben einen Wert zurück.
  • CS0163: Die Steuerung kann nicht von einer case-Bezeichnung ('label') zur anderen übergehen
  • CS9393: Keine einschließende Schleife oder switch-Anweisung mit dem Bezeichner 'label', die mit 'break' verlassen werden kann
  • CS9394: Keine umschließende Schleife mit der Bezeichnung 'label', mit der fortgefahren werden kann

Die folgende Warnung tritt auf, wenn eine goto case Anweisung auf einen Wert abzielt, der eine Konvertierung erfordert:

  • CS0469: Der Wert "goto case" ist nicht implizit in typ "type" konvertierbar.

Unterbrechen und Fortsetzen von Zielen

  • CS0139: Keine umschließende Schleife, aus der heraus abgebrochen oder fortgefahren werden kann
  • CS9393: Keine einschließende Schleife oder switch-Anweisung mit der Bezeichnung „label“, aus der ausgebrochen werden kann
  • CS9394: Keine umschließende Schleife mit der Bezeichnung "Label", aus der die Fortsetzung fortgesetzt werden soll

Die break-Anweisung beendet die Ausführung der innersten umschließenden Schleife oder switch-Anweisung, und die continue-Anweisung beginnt die nächste Iteration der innersten umschließenden Schleife. Der Compiler meldet diese Diagnose, wenn es dieses Ziel nicht finden kann.

So beheben Sie diese Fehler:

  • Platzieren Sie die break- oder continue-Anweisung in einer while-, do-, for- oder foreach-Schleife. Eine break-Anweisung kann auch in einem switch-Abschnitt vorkommen. Ein eigenständiges break oder continue, das nicht in eine dieser Anweisungen eingebettet ist, hat kein Ziel (CS0139).
  • Wenn Sie eine mit einem Label versehene break (break label;) schreiben, weisen Sie dasselbe Label einer umschließenden Schleife oder switch-Anweisung zu. Die Bezeichnung muss eine Schleife oder switch benennen, die die break-Anweisung enthält (CS9393).
  • Wenn Sie eine beschriftete continue (continue label;) Schreiben, wenden Sie dieselbe Bezeichnung auf eine eingeschlossene Schleife an. Ein bezeichnetes continue kann nur eine Schleife kennzeichnen, keine switch-Anweisung, da continue die nächste Iteration der Schleife startet (CS9394).

Weitere Informationen zu diesen Anweisungen finden Sie unter der break-Anweisung und der continue-Anweisung im Artikel zu Sprunganweisungen.

Goto-Anweisungsziele

  • CS0153: Eine goto-case-Anweisung ist nur in einer switch-Anweisung zulässig
  • CS0159: Keine solche Bezeichnung "label" im Rahmen der Goto-Anweisung
  • CS0469: Der Wert "goto case" ist nicht implizit in typ "type" konvertierbar.

Die goto Anweisung überträgt die Steuerung an eine beschriftete Anweisung, an eine case Bezeichnung oder an die default Bezeichnung einer switch Anweisung. Der Compiler meldet diese Diagnose, wenn die Zielbezeichnung nicht vorhanden ist oder nicht über die goto Anweisung erreichbar ist.

So beheben Sie diese Fehler:

  • Verwenden Sie goto case und goto default nur innerhalb einer switch-Anweisung. Beide Formen bezeichnen einen Abschnitt der umschließenden switch Anweisung, daher haben sie außerhalb einer solchen keine Bedeutung (CS0153).
  • Fügen Sie eine Bezeichnung hinzu, die dem Namen in der goto Anweisung entspricht, und bestätigen Sie, dass sich die Bezeichnung im Bereich der goto Anweisung befindet. Eine goto Anweisung kann nicht in einen geschachtelten Block springen und goto case erfordert eine übereinstimmende case Bezeichnung in derselben switch Anweisung (CS0159).
  • Weisen Sie dem Wert denselben goto case Typ wie der switch regelbezogene Ausdruck zu, oder fügen Sie eine explizite Umwandlung hinzu, sodass eine implizite Konvertierung vorhanden ist. Verwenden Sie beispielsweise goto case (char)127; anstelle von goto case 127;, wenn switch einen char-Wert steuert (CS0469).

Weitere Informationen zur goto-Anweisung finden Sie unter der goto-Anweisung im Artikel „Sprunganweisungen“. Weitere Informationen zu goto case und goto default finden Sie in der switch-Anweisung im Artikel zu Auswahlanweisungen.

Abschnittsende wechseln

  • CS0163: Der Kontrollfluss kann nicht von einer case-Bezeichnung ('label') zur nächsten übergehen

C# lässt nicht zu, dass der Kontrollfluss von einem switch-Abschnitt in den nächsten weiterfällt. Wenn eine switch Anweisung mehrere Abschnitte enthält, müssen Sie jeden Abschnitt einschließlich des letzten Abschnitts explizit beenden.

Um diesen Fehler zu beheben, beenden Sie jeden switch-Abschnitt, der Anweisungen enthält, mit einer Sprunganweisung, z. B. break, return, goto case, goto default oder throw. Wenn Sie die gleichen Anweisungen für mehrere Werte ausführen möchten, stapeln Sie die case Beschriftungen ohne Anweisungen dazwischen; diese Anordnung fällt nicht durch. Wenn ein Abschnitt in einem anderen fortgesetzt werden soll, verwenden Sie goto case oder goto default, um den nächsten Abschnitt explizit zu benennen (CS0163).

Weitere Informationen zur switch-Anweisung finden Sie unter die switch-Anweisung im Artikel zu Auswahlanweisungen. Weitere Informationen zur Anweisung throw finden Sie unter Die Anweisung throw im Artikel über Anweisungen zur Ausnahmebehandlung.

Rückgabe-Anweisungswerte

  • CS0126: Ein Objekt eines Typs, das in "Type" wandelbar ist, ist erforderlich.
  • CS0127: Da "method" "void" zurückgibt, darf kein Rückgabeschlüsselwort gefolgt von einem Objektausdruck sein.
  • CS0161: 'method': Nicht alle Codepfade geben einen Wert zurück.

Die return Anweisung beendet die Ausführung des enthaltenden Elements und gibt die Steuerung an den Aufrufer zurück. Eine return Anweisung kann auch einen Wert zurückgeben.

So beheben Sie diese Fehler:

  • Geben Sie in jeder return Anweisung eines Elements einen Wert an, der einen Nicht-Rückgabetypvoid aufweist, und stellen Sie sicher, dass der Wert in diesen Rückgabetyp konvertierbar ist. Ein get Accessor und eine Wertrückgabemethode erfordern beide eine return Anweisung, die einen Wert (CS0126) enthält.
  • Entfernen Sie den Wert aus einer beliebigen return-Anweisung in einem Member, das void zurückgibt, z. B. aus einem set-Accessor oder einer Methode mit dem Rückgabetyp void. Verwenden Sie eine bare return; Anweisung, um früh zu beenden (CS0127).
  • Stellen Sie sicher, dass jeder Codepfad in einem Member mit Rückgabewert mit einer return-Anweisung oder einer throw-Anweisung endet. Ein Member gibt auf allen Codepfaden einen Wert zurück, wenn in jeder Verzweigung jeder bedingten Anweisung ein Wert zurückgegeben wird oder wenn der bedingten Logik eine abschließende return-Anweisung folgt (CS0161).

Weitere Informationen zu return-Anweisungen in asynchronen Methoden und Membern, die Task- oder ValueTask-Typen zurückgeben, finden Sie unter Fehler und Warnungen im Zusammenhang mit async und await. Weitere Informationen zu return-Anweisungen in Iteratoren finden Sie unter Fehler und Warnungen im Zusammenhang mit Iteratoren.

Weitere Informationen zur return-Anweisung finden Sie unter der return-Anweisung im Artikel „Sprunganweisungen“.

C#-Sprachspezifikation

Weitere Informationen finden Sie im Abschnitt "Jump-Anweisungen " der C#-Sprachspezifikation.

Siehe auch