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


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

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

В следующем примере показано 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 разделе выражениязаметки о предложении функции.

См. также