Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
wyrażenie switch — wyrażenia dopasowania wzorca przy użyciu słowa kluczowego
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 switchsemantyka podobną do semantyki w kontekście instrukcji, zobacz switch 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
switchsłowo kluczowe . W poprzednim przykładzie jestdirectionto parametr metody. -
switchRamiona wyrażenia oddzielone przecinkami. Każdeswitchramię 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
Directionwartości wyliczenia. -
Wzorzec odrzucania: aby obsłużyć dowolną wartość całkowitą, która nie ma odpowiedniego
Directionelementu członkowskiego wyliczenia (na przykład(Direction)10). To sprawia, że wyrażenie jestswitchwyczerpują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 truewyraż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.
Wskazówka
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ńspecyfikacji języka C#.