espressione switch: espressioni dei criteri di ricerca tramite la parola chiave switch

È possibile usare l'espressione switch per valutare una singola espressione da un elenco di espressioni candidate in base a una corrispondenza di criteri con un'espressione di input. Per informazioni sull'istruzione switch che supporta la semantica di tipo switch in un contesto di istruzione, vedere la sezione relativa all'istruzione switch dell'articolo Istruzioni di selezione.

Nell'esempio seguente viene illustrata un'espressione switch che converte i valori di un oggetto enum che rappresenta le direzioni visive in una mappa online alle direzioni cardinali corrispondenti:

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
    }
}

L'esempio precedente mostra gli elementi di base di un'espressione switch:

  • Espressione seguita dalla parola chiave switch. Nell'esempio precedente, si tratta del parametro del metodo direction.
  • Gli elementi dell'espressione switch, separati da virgole. Ogni elemento dell'espressione switch contiene un criterio, un case guard facoltativo, il token => e un'espressione .

Nell'esempio precedente, un'espressione switch usa i modelli seguenti:

  • Un modello costante: per gestire i valori definiti dell'enumerazione Direction.
  • Un modello discard: per gestire qualsiasi valore intero che non abbia il membro corrispondente dell'enumerazione Direction, ad esempio (Direction)10. Ciò rende l'espressione switchesaustiva.

Importante

Per informazioni sui modelli supportati dall'espressione switch e altri esempi, vedere Patterns.

Il risultato di un'espressione switch è il valore dell'espressione del primo elemento dell'espressione switch il cui criterio corrisponde all'espressione di input e il case guard, se presente, restituisce true. Gli elementi dell'espressione switch vengono valutati in ordine testuale.

Il compilatore genera un errore quando non è possibile scegliere un elemento dell'espressione switch inferiore perché un elemento dell'espressione switch superiore corrisponde a tutti i relativi valori.

Casi guard

Un criterio potrebbe non essere sufficientemente espressivo per specificare la condizione per la valutazione dell'espressione di un elemento. In questo caso, è possibile usare un case guard. Un case guard è un'altra condizione che deve essere soddisfatta insieme a un modello corrispondente. Un case guard deve essere costituito da un'espressione booleana. Si specifica un case guard dopo la parola chiave when che segue un modello, come illustrato nell'esempio seguente:

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),
};

Nell'esempio precedente vengono usati modelli di proprietà con modellivar annidati.

Espressione switch non esaustiva

Se nessuno dei modelli di un'espressione switch corrisponde a un valore di input, il runtime genera un'eccezione. In .NET Core 3.0 e versioni successive l'eccezione è System.Runtime.CompilerServices.SwitchExpressionException. In .NET Framework, l'eccezione è InvalidOperationException. Nella maggior parte dei casi, il compilatore genera un avviso se un'espressione switch non gestisce tutti i valori di input possibili. Modelli di elenco non generano un avviso quando tutti gli input possibili non vengono gestiti.

Suggerimento

Per garantire che un'espressione switch gestisca tutti i possibili valori di input, fornire un elemento di espressione switch con un criterio discard.

Specifiche del linguaggio C#

Per altre informazioni, vedere la sezione dell'espressioneswitch della nota sulla proposta di funzionalità .

Vedi anche