expresión switch: expresiones de coincidencia de patrones mediante la switch
palabra clave
Se usa la expresión switch
para evaluar una expresión única a partir de una lista de expresiones candidatas basadas en una coincidencia de patrón con una expresión de entrada. Para obtener información sobre la instrucción switch
que admite la semántica switch
en un contexto de instrucción, consulte la sección instrucción switch
del artículo Instrucciones de selección.
En el ejemplo siguiente se muestra una expresión switch
, que traslada los valores de un objeto enum
que representa las direcciones visuales de un mapa en línea hasta la dirección cardinal correspondiente:
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
}
}
En el ejemplo anterior se muestran los elementos básicos de una expresión switch
:
- Expresión seguida de la palabra clave
switch
. En el ejemplo anterior, es el parámetro del métododirection
. - Los brazos de la expresión
switch
, separados por comas. Cada brazo de la expresiónswitch
contiene un patrón, una restricción de mayúsculas y minúsculas opcional, el token=>
y una expresión.
En el ejemplo anterior, una expresión switch
usa los siguientes patrones:
- Un patrón constante para controlar los valores definidos de la enumeración
Direction
. - Un patrón de descarte para controlar cualquier valor entero que no tenga el miembro correspondiente de la enumeración
Direction
(como,(Direction)10
). Esto hace que la expresiónswitch
sea exhaustiva.
Importante
Para obtener información sobre los patrones admitidos por una expresión switch
y más ejemplos, consulte Patrones.
El resultado de la expresión switch
es el valor de la expresión del primer brazo de la expresión switch
cuyo patrón coincide con la expresión de intervalo y cuya restricción de mayúsculas y minúsculas, en caso de estar presente, se evalúa como true
. Los brazos de la expresión switch
se evalúan en orden de texto.
El compilador emite un error cuando no se puede elegir un brazo de la expresión switch
inferior porque un brazo de la expresión switch
superior coincide con todos sus valores.
Restricciones de mayúsculas y minúsculas
Un patrón puede no ser lo suficientemente expresivo como para especificar la condición para la evaluación de la expresión de un brazo. En tal caso, puede usar una restricción de caso. Una restricción de caso es una condición adicional que debe cumplirse junto con un patrón coincidente. Una restricción de caso debe ser una expresión booleana. Especifique una restricción de mayúsculas y minúsculas después de la palabra clave when
que sigue un patrón, como se muestra en el ejemplo siguiente:
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),
};
En el ejemplo anterior se usan patrones de propiedad con patrones var anidados.
Expresiones switch no exhaustivas
Si ninguno de los patrones de una expresión switch
coincide con un valor de entrada, el entorno de ejecución produce una excepción. En .NET Core 3.0 y versiones posteriores, la excepción es System.Runtime.CompilerServices.SwitchExpressionException. En .NET Framework, la excepción es InvalidOperationException. En la mayoría de los casos, el compilador genera una advertencia si una expresión switch
no controla todos los valores de entrada posibles. Los patrones de lista no generan una advertencia cuando no se controlan todas las entradas posibles.
Sugerencia
Para garantizar que una expresión switch
controle todos los valores de entrada posibles, proporcione un brazo de expresión switch
con un patrón de descarte.
Especificación del lenguaje C#
Para obtener más información, vea la sección sobre la expresión de switch
de la nota de propuesta de características.