switch expression - pattern matching expressions using the switch keyword

Výraz použijete switch k vyhodnocení jednoho výrazu ze seznamu kandidátských výrazů na základě shody vzoru se vstupním výrazem. Informace o switch příkazu, který podporuje switch-like sémantiku v kontextu příkazu, naleznete switch v oddílu příkazu v článku Výběr příkazů.

Následující příklad ukazuje switch výraz, který převádí 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 výrazu switch :

  • Výraz následovaný klíčovým slovem switch . V předchozím příkladu direction je to parametr metody.
  • Ramena výrazu switchoddělená čárkami. Každá switch arma výrazu obsahuje vzor, volitelnou ochranu velkých a malých písmen, => token a výraz.

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

  • Konstantní vzor: zpracování definovaných hodnot výčtu Direction .
  • Vzor zahození: Zpracování libovolné celočíselné hodnoty, která nemá odpovídající člen výčtu Direction (například(Direction)10). Výraz tak switchbude vyčerpávající.

Důležité

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

Výsledkem výrazu switch je hodnota výrazu prvního switch výrazu, jehož vzor odpovídá vstupnímu výrazu a jehož případová ochrana je vyhodnocena jako true. Ramena výrazů switch se vyhodnocují v textovém pořadí.

Kompilátor vygeneruje chybu, když nejde zvolit arm nižšího switch výrazu, protože arm vyššího switch výrazu odpovídá všem jeho hodnotám.

Kryty případu

Vzor nemusí být dostatečně výrazný, aby určil podmínku pro vyhodnocení výrazu arm. V takovém případě můžete použít ochranu případu. Ochrana případu je další podmínkou, která musí být splněna společně s odpovídajícím vzorem. Ochrana případu musí být logickým výrazem. Za klíčové slovo, které se řídí vzorem, zadáte ochranu when případu, 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 vzory var.

Neskonvativní výrazy 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 System.Runtime.CompilerServices.SwitchExpressionExceptionvýjimka . V rozhraní .NET Framework je výjimka .InvalidOperationException Ve většině případů kompilátor vygeneruje upozornění, pokud switch výraz nezpracuje všechny možné vstupní hodnoty. Vzory seznamů nevygenerují upozornění, pokud se nezpracují všechny možné vstupy.

Tip

Pokud chcete zaručit, že switch výraz zpracovává všechny možné vstupní hodnoty, zadejte switch arm výrazu se vzorem zahození.

specifikace jazyka C#

Další informace najdete v switch části výrazu návrhu funkce.

Viz také