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říkladudirection
je to parametr metody. - Ramena výrazu
switch
oddě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 takswitch
bude 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.