Freigeben über


switch expression – Musterabgleichsausdrücke mit dem switch Schlüsselwort

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 switch Schlüsselwort. Im vorherigen Beispiel ist es der direction Methodenparameter.
  • Die switch Ausdrucksarme, getrennt durch Kommas. Jeder switch Ausdrucksarm 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 Direction Enumeration zu behandeln.
  • Ein Verwerfenmuster: Zum Behandeln eines ganzzahligen Werts, der nicht über das entsprechende Element der Direction Enumeration verfügt (z. B (Direction)10. ). Dadurch wird der switch Ausdruck 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