Udostępnij przez


switchexpression — wyrażenia pasujące do wzorca przy użyciu słowa kluczowego switch

switch Użyj wyrażenia, aby ocenić pojedyncze wyrażenie z listy wyrażeń kandydatów. Ocena jest oparta na dopasowaniu wzorca z wyrażeniem wejściowym. Aby uzyskać informacje na temat switch instrukcji obsługującej switchsemantyka podobną do semantyki w kontekście instrukcji, zobacz switch sekcję instrukcji Selection artykułu.

Dokumentacja języka C# zawiera ostatnio wydaną wersję języka C#. Zawiera również początkową dokumentację dla funkcjonalności w publicznych wersjach testowych nadchodzącego wydania języka.

Dokumentacja identyfikuje dowolną funkcję po raz pierwszy wprowadzoną w ostatnich trzech wersjach języka lub w bieżącej publicznej wersji zapoznawczej.

Wskazówka

Aby dowiedzieć się, kiedy funkcja została po raz pierwszy wprowadzona w języku C#, zapoznaj się z artykułem dotyczącym historii wersji języka C#.

W poniższym przykładzie pokazano switch wyrażenie. 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). Ten wzorzec sprawia, że wyrażenie jest switchwyczerpują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 należy 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. Określ ochronę wielkości liter po słowie when kluczowym, który jest zgodny 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.

Wskazówka

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ńspecyfikacji języka C#.

Zobacz także