Nota
L'accés a aquesta pàgina requereix autorització. Pots provar d'iniciar sessió o canviar de directori.
L'accés a aquesta pàgina requereix autorització. Pots provar de canviar directoris.
Use la switch expresión para evaluar una expresión única de una lista de expresiones candidatas. La evaluación se basa 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 .
La documentación de referencia del lenguaje C# cubre la versión más reciente publicada del lenguaje C#. También contiene documentación inicial sobre las características de las versiones preliminares públicas de la próxima versión del lenguaje.
La documentación identifica cualquier característica introducida por primera vez en las últimas tres versiones del idioma o en las versiones preliminares públicas actuales.
Sugerencia
Para buscar cuándo se introdujo por primera vez una característica en C#, consulte el artículo sobre el historial de versiones del lenguaje C#.
En el ejemplo siguiente se muestra una switch expresión. Convierte los valores de un enum objeto que representa las direcciones visuales de 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). Ese patrón 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
Es posible que un patrón no sea lo suficientemente expresivo como para especificar la condición para la evaluación de la expresión de un brazo. En tal caso, use 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#.