Condividi tramite


switch expression : espressioni di ricerca di criteri usando la switch parola chiave

L'espressione switch viene usata 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 switchla semantica simile in un contesto di istruzione, vedere la sezione relativa all'istruzioneswitch dell'articolo Istruzioni Selection.

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 switch parola chiave . Nell'esempio precedente si tratta del parametro del direction metodo .
  • Le braccia dell'espressioneswitch, separate da virgole. Ogni switch arm di espressione contiene un criterio, un case guard facoltativo, il => token e un'espressione.

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

  • Modello costante: per gestire i valori definiti dell'enumerazione Direction .
  • 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 e altri esempi, vedere Patterns.For information about the patterns supported by the switch expression and more examples, see Patterns.

Il risultato di un'espressione switch è il valore dell'espressione del primo switch arm di espressione il cui criterio corrisponde all'espressione di input e la cui protezione tra maiuscole e minuscole, se presente, restituisce true. Le braccia dell'espressione switch vengono valutate in ordine di testo.

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

Guardie case

Un criterio potrebbe non essere sufficientemente espressivo per specificare la condizione per la valutazione dell'espressione di un braccio. In questo caso, è possibile usare una guardia caso. Un case guard è un'altra condizione che deve essere soddisfatta insieme a un modello corrispondente. Un case guard deve essere un'espressione booleana. Si specifica un case guard dopo la when parola chiave 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 modelli var annidati.

Espressioni switch non esaustive

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. I 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 arm di switch espressione con un criterio di eliminazione.

Specificazione del linguaggio C#

Per altre informazioni, vedere la sezione relativa all'espressioneswitch della specifica del linguaggio C#.

Vedere anche