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