Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
switch expression : espressioni di ricerca di criteri usando la
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
switchparola chiave . Nell'esempio precedente si tratta del parametro deldirectionmetodo . - Le braccia dell'espressione
switch, separate da virgole. Ogniswitcharm 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'espressioneswitchesaustiva.
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#.