Switch – výraz (Referenční dokumentace jazyka C#)

Počínaje jazykem C# 8,0 použijete switch výraz k vyhodnocení jednoho výrazu ze seznamu kandidátních výrazů, který je založen na shodě vzoru se vstupním výrazem. Informace o switch příkazu, který podporuje switch sémantiku jako v kontextu příkazu, naleznete v části switch Statement v článku Příkazy výběru .

Následující příklad ukazuje switch výraz, který převede hodnoty enum představující vizuální směry v online mapě na odpovídající směry mohutnosti:

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

Předchozí příklad ukazuje základní prvky switch výrazu:

  • Výraz následovaný switch klíčovým slovem. V předchozím příkladu je to direction parametr metody.
  • switch Paže výrazu oddělené čárkami. Každý switch výraz ARM obsahuje vzor, volitelný případ Guard, => token a výraz.

V předchozím příkladu switch výraz používá následující vzory:

  • Konstantní vzorek: pro zpracování definovaných hodnot Direction výčtu.
  • Vzor zahození: pro zpracování celočíselné hodnoty, která nemá odpovídajícího člena Direction výčtu (například (Direction)10 ). Tím se výraz nastaví jako switch vyčerpávající.

Důležité

Informace o vzorech podporovaných switch výrazem a dalších příkladech naleznete v tématu Patterns.

Výsledek switch výrazu je hodnota výrazu pro první switch výraz ARM, jehož vzor se shoduje se vstupním výrazem a v případě, že je k dispozici, je vyhodnocen jako true . switchPaže v výrazu jsou vyhodnocovány v textovém pořadí.

Kompilátor vygeneruje chybu, pokud switch nelze vybrat dolní výraz ARM, protože horní switch výraz ARM odpovídá všem jeho hodnotám.

Případná Guardy

Vzor nemusí být dostatečně dlouhý pro určení podmínky pro vyhodnocení výrazu ARM. V takovém případě můžete použít ochranu velkých a malých písmen. To je další podmínka, která musí být splněná spolu s odpovídajícím vzorem. Ochrana písmen v případě musí být logický výraz. Za when klíčovým slovem, které následuje vzor, zadáte Guard malých písmen, jak ukazuje následující příklad:

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

Předchozí příklad používá vzory vlastností s vnořenými vzorci var.

Výrazy nevyčerpávajícího přepínače

Pokud žádný ze switch vzorů výrazu neodpovídá vstupní hodnotě, modul runtime vyvolá výjimku. V .NET Core 3,0 a novějších verzích je výjimka System.Runtime.CompilerServices.SwitchExpressionException . v .NET Framework je výjimka InvalidOperationException . Kompilátor vygeneruje upozornění, pokud switch výraz nezpracovává všechny možné vstupní hodnoty.

Tip

Chcete-li zaručit, že switch výraz zpracovává všechny možné vstupní hodnoty, poskytněte switch pomocí vzoru zahozenívýraz ARM.

specifikace jazyka C#

Další informace najdete v části switch výraz poznámky k návrhu funkcí.

Viz také