wyrażenie switch — wyrażenia dopasowania wzorca przy użyciu słowa kluczowego switch
Wyrażenie służy switch
do oceniania pojedynczego wyrażenia z listy wyrażeń kandydatów na podstawie dopasowania wzorca z wyrażeniem wejściowym. Aby uzyskać informacje na temat switch
instrukcji obsługującej switch
semantyka podobną do semantyki w kontekście instrukcji, zobaczswitch
sekcję instrukcji Selection artykułu.
W poniższym przykładzie pokazano switch
wyrażenie, które 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 jestdirection
to parametr metody. switch
Ramiona wyrażenia oddzielone przecinkami. Każdeswitch
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
). To sprawia, że wyrażenie jestswitch
wyczerpują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 true
wyraż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 można 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. Należy określić ochronę wielkości liter po słowie when
kluczowym, które jest zgodne 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.
Napiwek
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ń notatki dotyczącej propozycji funkcji.