Поделиться через


switch выражение — выражения сопоставления шаблонов с помощью ключевого switch слова

switch Используйте выражение для вычисления одного выражения из списка потенциальных выражений. Оценка основана на сопоставлении шаблонов с входным выражением. Сведения об switch инструкции, поддерживающей switchсемантику как в контексте инструкций, см switch. в разделе инструкции Selection.

Справочные документы по языку C# описывают последнюю выпущенную версию языка C#. Она также содержит начальную документацию по функциям в общедоступных предварительных версиях для предстоящего языкового выпуска.

Документация определяет любую функцию, впервые представленную в последних трех версиях языка или в текущих общедоступных предварительных версиях.

Подсказка

Чтобы узнать, когда функция впервые появилась в C#, ознакомьтесь со статьей об истории версий языка C#.

В следующем примере показано switch выражение. Он преобразует значения визуальных направлений enum в онлайн-карте в соответствующие кардинальные направления:

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
    }
}

В предыдущем примере показаны основные элементы switch выражения:

  • Выражение, за которым следует ключевое switch слово. В предыдущем примере это direction параметр метода.
  • switch Руки выражения, разделенные запятыми. Каждая switch рука выражения содержит шаблон, необязательный охранник регистра, => маркер и выражение.

В предыдущем примере switch выражение использует следующие шаблоны:

  • Шаблон константы: для обработки определенных значений перечисленияDirection.
  • Шаблон отмены: для обработки любого целочисленного значения, которое не имеет соответствующего Direction члена перечисления (например, (Direction)10). Этот шаблон делает switch выражение исчерпывающим.

Это важно

Сведения о шаблонах, поддерживаемых switch выражением и дополнительными примерами, см. в разделе "Шаблоны".

Результатом switch выражения является значение выражения первой switch руки выражения, шаблон которого соответствует входной выражению и чей аргумент регистра, если он присутствует, оценивается true. Руки выражений switch вычисляются в порядке текста.

Компилятор создает ошибку, когда не удается выбрать нижнюю switch руку выражения, так как более высокая switch строка выражения соответствует всем его значениям.

Охранники дела

Шаблон может быть недостаточно выражен, чтобы указать условие для оценки выражения руки. В таком случае используйте защиту регистра. Защита регистра — это другое условие, которое должно быть удовлетворено вместе с соответствующим шаблоном. Охранник регистра должен быть логическим выражением. Укажите защиту регистра после ключевого when слова, следующего за шаблоном, как показано в следующем примере:

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),
};

В предыдущем примере используются шаблоны свойств с вложенными шаблонами var.

Неисчерпаемые выражения коммутатора

Если ни одна из switch шаблонов выражения не соответствует входной значению, среда выполнения создает исключение. В .NET Core 3.0 и более поздних версиях исключение является System.Runtime.CompilerServices.SwitchExpressionException. В .NET Framework исключение является .InvalidOperationException В большинстве случаев компилятор создает предупреждение, если switch выражение не обрабатывает все возможные входные значения. Шаблоны списка не создают предупреждение, если все возможные входные данные не обрабатываются.

Подсказка

Чтобы гарантировать, что switch выражение обрабатывает все возможные входные значения, предоставьте switch руку выражения с шаблоном отмены.

Спецификация языка C#

Дополнительные сведения см. в switch разделе выраженийспецификации языка C#.

См. также