выражение 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
в этой заметке о предлагаемых функциях.