Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
switch expression – Musterabgleichsausdrücke mit dem
Sie verwenden den switch Ausdruck, um einen einzelnen Ausdruck aus einer Liste von Kandidatenausdrücken basierend auf einer Musterausstimmung mit einem Eingabeausdruck auszuwerten. Informationen zu der Anweisung, die switch -ähnliche Semantik in einem Anweisungskontext unterstützt switch, finden Sie im switch Abschnitt " Anweisung" des Artikels "Selection-Anweisungen ".
Im folgenden Beispiel wird ein switch Ausdruck veranschaulicht, der Werte einer enum visuellen Wegbeschreibung in einer Onlinekarte in die entsprechenden Kardinalrichtungen konvertiert:
public static class SwitchExample
{
public enum Direction
{
Up,
Down,
Right,
Left
}
public enum Orientation
{
North,
South,
East,
West
}
public static Orientation ToOrientation(Direction direction) => direction switch
{
Direction.Up => Orientation.North,
Direction.Right => Orientation.East,
Direction.Down => Orientation.South,
Direction.Left => Orientation.West,
_ => throw new ArgumentOutOfRangeException(nameof(direction), $"Not expected direction value: {direction}"),
};
public static void Main()
{
var direction = Direction.Right;
Console.WriteLine($"Map view direction is {direction}");
Console.WriteLine($"Cardinal orientation is {ToOrientation(direction)}");
// Output:
// Map view direction is Right
// Cardinal orientation is East
}
}
Das vorangehende Beispiel zeigt die grundlegenden Elemente eines switch Ausdrucks:
- Ein Ausdruck gefolgt vom
switchSchlüsselwort. Im vorherigen Beispiel ist es derdirectionMethodenparameter. - Die
switchAusdrucksarme, getrennt durch Kommas. JederswitchAusdrucksarm enthält ein Muster, einen optionalen Fallschutz, das=>Token und einen Ausdruck.
Im vorherigen Beispiel verwendet ein switch Ausdruck die folgenden Muster:
- Ein Konstantenmuster: um die definierten Werte der
DirectionEnumeration zu behandeln. - Ein Verwerfenmuster: Zum Behandeln eines ganzzahligen Werts, der nicht über das entsprechende Element der
DirectionEnumeration verfügt (z. B(Direction)10. ). Dadurch wird derswitchAusdruck erschöpfend.
Von Bedeutung
Informationen zu den mustern, die switch vom Ausdruck und weiteren Beispielen unterstützt werden, finden Sie unter Patterns.
Das Ergebnis eines switch Ausdrucks ist der Wert des Ausdrucks des ersten switch Ausdrucksarms, dessen Muster mit dem Eingabeausdruck übereinstimmt und dessen Case Guard( falls vorhanden) ausgewertet wird true. Die switch Ausdrucksarme werden in der Textreihenfolge ausgewertet.
Der Compiler generiert einen Fehler, wenn ein niedrigerer switch Ausdrucksarm nicht ausgewählt werden kann, da ein höherer switch Ausdrucksarm mit allen zugehörigen Werten übereinstimmt.
Case Guards
Ein Muster ist möglicherweise nicht ausdrucksstark genug, um die Bedingung für die Auswertung eines Armausdrucks anzugeben. In einem solchen Fall können Sie einen Fallschutz verwenden. Bei einem Fallschutz handelt es sich um eine weitere Bedingung, die zusammen mit einem übereinstimmenden Muster erfüllt werden muss. Ein Case Guard muss ein boolescher Ausdruck sein. Sie geben einen Case Guard nach dem Schlüsselwort an, das when einem Muster folgt, wie das folgende Beispiel zeigt:
public readonly struct Point
{
public Point(int x, int y) => (X, Y) = (x, y);
public int X { get; }
public int Y { get; }
}
static Point Transform(Point point) => point switch
{
{ X: 0, Y: 0 } => new Point(0, 0),
{ X: var x, Y: var y } when x < y => new Point(x + y, y),
{ X: var x, Y: var y } when x > y => new Point(x - y, y),
{ X: var x, Y: var y } => new Point(2 * x, 2 * y),
};
Im vorherigen Beispiel werden Eigenschaftsmuster mit geschachtelten Varmustern verwendet.
Nicht erschöpfende Switchausdrücke
Wenn keines der Muster eines switch Ausdrucks einem Eingabewert entspricht, löst die Laufzeit eine Ausnahme aus. In .NET Core 3.0 und höheren Versionen ist die Ausnahme eine System.Runtime.CompilerServices.SwitchExpressionException. In .NET Framework ist die Ausnahme eine InvalidOperationException. In den meisten Fällen generiert der Compiler eine Warnung, wenn ein switch Ausdruck nicht alle möglichen Eingabewerte behandelt.
Listenmuster generieren keine Warnung, wenn alle möglichen Eingaben nicht behandelt werden.
Tipp
Um sicherzustellen, dass ein switch Ausdruck alle möglichen Eingabewerte verarbeitet, stellen Sie einen switch Ausdrucksarm mit einem Verwerfenmuster bereit.
C#-Sprachspezifikation
Weitere Informationen finden Sie im switch Abschnitt "Ausdruck " der C#-Sprachspezifikation.
Siehe auch
- Verwenden des Schalterausdrucks (Formatvorlagenregel IDE0066)
- Hinzufügen fehlender Fälle zum Wechseln des Ausdrucks (Formatvorlagenregel IDE0072)
- C# Operatoren und Ausdrücke
- Muster
- Tutorial: Verwenden des Musterabgleichs, um typgesteuerte und datengesteuerte Algorithmen zu erstellen
-
switch-Anweisung