Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
switch expression: expresiones de coincidencia de patrones mediante la
La expresión se usa switch para evaluar una expresión única 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 switch instrucción que admite switchla semántica similar en un contexto de instrucción, consulte la switch sección de instrucciones selection del artículo Instrucciones selection .
En el ejemplo siguiente se muestra una switch expresión, que convierte los valores de una enum dirección visual que representa direcciones visuales en un mapa en línea a las direcciones cardinales correspondientes:
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 switch expresión:
- Expresión seguida de la
switchpalabra clave . En el ejemplo anterior, es el parámetro dedirectionmétodo. - Los brazos de
switchexpresión, separados por comas. Cadaswitchbrazo de expresión contiene un patrón, una protección de mayúsculas y minúsculas opcional, el=>token y una expresión.
En el ejemplo anterior, una switch expresión usa los siguientes patrones:
- Patrón constante: para controlar los valores definidos de la
Directionenumeración. - Un patrón de descarte: para controlar cualquier valor entero que no tenga el miembro correspondiente de la
Directionenumeración (por ejemplo,(Direction)10). Esto hace que la expresión seaswitchexhaustiva.
Importante
Para obtener información sobre los patrones admitidos por la switch expresión y más ejemplos, vea Patrones.
El resultado de una switch expresión es el valor de la expresión del primer switch brazo de expresión cuyo patrón coincide con la expresión de entrada y cuya protección de mayúsculas y minúsculas, si está presente, se evalúa como true. Los switch brazos de expresión se evalúan en orden de texto.
El compilador genera un error cuando no se puede elegir un brazo de expresión inferior switch porque un brazo de expresión superior switch coincide con todos sus valores.
Protección 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 protección de casos. Una protección de casos es otra condición que debe cumplirse junto con un patrón coincidente. Una protección de casos debe ser una expresión booleana. Especifique una protección de mayúsculas y minúsculas después de la when palabra clave 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 de conmutador no exhaustivas
Si ninguno de los patrones de una switch expresión coincide con un valor de entrada, el tiempo 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 switch expresión 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 switch expresión controla todos los valores de entrada posibles, proporcione un switch brazo de expresión con un patrón de descarte.
Especificación del lenguaje C#
Para obtener más información, consulte la switch sección expresión de la especificación del lenguaje C#.