Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Pomocí výrazu switch můžete vyhodnotit jeden výraz ze seznamu kandidátských výrazů. Vyhodnocení vychází ze shody vzorů 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ů.
Referenční dokumentace jazyka C# dokumentuje naposledy vydané verze jazyka C#. Obsahuje také počáteční dokumentaci k funkcím ve verzi Public Preview pro nadcházející jazykovou verzi.
Dokumentace identifikuje všechny funkce, které byly poprvé představeny v posledních třech verzích jazyka nebo v aktuálních verzích Public Preview.
Tip
Informace o tom, kdy byla funkce poprvé představena v jazyce C#, najdete v článku o historii verzí jazyka C#.
Následující příklad ukazuje switch výraz. Převede hodnoty enum představující vizuální směry v online mapě na odpovídající směry kardinaly:
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říkladudirectionje to parametr metody. - Ramena výrazu
switchoddělená čárkami. Každáswitcharma 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). Tento vzor výraz ztěžujeswitch.
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ě použijte 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. Zadejte ochranu případu za when klíčovým slovem, které se řídí vzorem, 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ýrazuspecifikace jazyka C#.