wyrażenie switch — wyrażenia dopasowania wzorca przy użyciu słowa kluczowego switch

Wyrażenie służy switch do oceniania pojedynczego wyrażenia z listy wyrażeń kandydatów na podstawie dopasowania wzorca z wyrażeniem wejściowym. Aby uzyskać informacje na temat switch instrukcji obsługującej switchsemantyka podobną do semantyki w kontekście instrukcji, zobaczswitchsekcję instrukcji Selection artykułu.

W poniższym przykładzie pokazano switch wyrażenie, które konwertuje wartości enum reprezentujące kierunek wizualizacji na mapie online na odpowiednie kierunki kardynalne:

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
    }
}

W poprzednim przykładzie przedstawiono podstawowe elementy switch wyrażenia:

  • Wyrażenie, po którym następuje switch słowo kluczowe . W poprzednim przykładzie jest direction to parametr metody.
  • switch Ramiona wyrażenia oddzielone przecinkami. Każde switch ramię wyrażeń zawiera wzorzec, opcjonalną ochronę wielkości liter, => token i wyrażenie.

W poprzednim przykładzie switch wyrażenie używa następujących wzorców:

  • Wzorzec stały: do obsługi zdefiniowanych Direction wartości wyliczenia.
  • Wzorzec odrzucania: aby obsłużyć dowolną wartość całkowitą, która nie ma odpowiedniego Direction elementu członkowskiego wyliczenia (na przykład (Direction)10). To sprawia, że wyrażenie jest switch wyczerpujące.

Ważne

Aby uzyskać informacje o wzorcach obsługiwanych przez switch wyrażenie i więcej przykładów, zobacz Wzorce.

Wynikiem switch wyrażenia jest wartość wyrażenia pierwszego switch ramienia wyrażenia, którego wzorzec pasuje do truewyrażenia wejściowego i którego funkcja ochrony wielkości liter, jeśli jest obecna, daje wartość . switch Ramiona wyrażeń są obliczane w kolejności tekstowej.

Kompilator generuje błąd, gdy nie można wybrać dolnego switch ramienia wyrażenia, ponieważ wyższe switch ramię wyrażenia pasuje do wszystkich jego wartości.

Osłony wielkości liter

Wzorzec może nie być wystarczająco wyraźny, aby określić warunek oceny wyrażenia arm. W takim przypadku można użyć ochrony wielkości liter. Ochrona wielkości liter to inny warunek, który musi być spełniony wraz z dopasowanym wzorcem. Ochrona wielkości liter musi być wyrażeniem logicznym. Należy określić ochronę wielkości liter po słowie when kluczowym, które jest zgodne ze wzorcem, jak pokazano w poniższym przykładzie:

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),
};

W poprzednim przykładzie użyto wzorców właściwości z zagnieżdżonym wzorcem var.

Wyrażenia przełączników niewyczerpujące

Jeśli żaden z switch wzorców wyrażenia nie pasuje do wartości wejściowej, środowisko uruchomieniowe zgłasza wyjątek. W wersjach .NET Core 3.0 i nowszych wyjątek to System.Runtime.CompilerServices.SwitchExpressionException. W programie .NET Framework wyjątek to InvalidOperationException. W większości przypadków kompilator generuje ostrzeżenie, jeśli switch wyrażenie nie obsługuje wszystkich możliwych wartości wejściowych. Wzorce list nie generują ostrzeżenia, gdy wszystkie możliwe dane wejściowe nie są obsługiwane.

Napiwek

Aby zagwarantować, że switch wyrażenie obsługuje wszystkie możliwe wartości wejściowe, podaj switch ramię wyrażenia ze wzorcem odrzucenia.

specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz sekcję switch wyrażeń notatki dotyczącej propozycji funkcji.

Zobacz też