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

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

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

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

Совет

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

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

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

См. также