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étodo direction.
  • Los brazos de la expresión switch , separados por comas. Cada brazo de la expresión switch 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ón switch 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.

Vea también