switchexpressie- patroonkoppelingsexpressies met behulp van het switch
trefwoord
U gebruikt de switch
expressie om één expressie te evalueren uit een lijst met kandidaat-expressies op basis van een patroonovereenkomst met een invoerexpressie. Zie deswitch
instructiesectie van het artikel Selectie-instructies voor informatie over de switch
instructie die ondersteuning biedt switch
voor semantiek in een instructiecontext.
In het volgende voorbeeld ziet u een switch
expressie, waarmee waarden van een enum
visuele routebeschrijving in een onlinekaart worden geconverteerd naar de bijbehorende kardinaliteitsrichtingen:
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
}
}
In het voorgaande voorbeeld ziet u de basiselementen van een switch
expressie:
- Een expressie gevolgd door het
switch
trefwoord. In het voorgaande voorbeeld is dit dedirection
methodeparameter. - De
switch
expressiearmen, gescheiden door komma's. Elkeswitch
expressiearm bevat een patroon, een optionele case guard, het=>
token en een expressie.
In het voorgaande voorbeeld gebruikt een switch
expressie de volgende patronen:
- Een constant patroon: voor het afhandelen van de gedefinieerde waarden van de
Direction
opsomming. - Een verwijderingspatroon: als u een geheel getal wilt verwerken dat niet het bijbehorende lid van de
Direction
opsomming heeft (bijvoorbeeld(Direction)10
). Dat maakt deswitch
expressie volledig.
Belangrijk
Zie Patronen voor meer informatie over de patronen die worden ondersteund door de switch
expressie en meer voorbeelden.
Het resultaat van een switch
expressie is de waarde van de expressie van de eerste switch
expressiearm waarvan het patroon overeenkomt met de invoerexpressie en waarvan de case guard, indien aanwezig, resulteert in true
. De switch
expressiearmen worden geëvalueerd in tekstvolgorde.
De compiler genereert een fout wanneer een arm met een lagere switch
expressie niet kan worden gekozen omdat een hogere switch
expressiearm overeenkomt met alle bijbehorende waarden.
Case guards
Een patroon kan niet expressief genoeg zijn om de voorwaarde voor de evaluatie van de expressie van een arm op te geven. In dat geval kunt u een case guard gebruiken. Een case guard is een andere voorwaarde waaraan moet worden voldaan samen met een overeenkomend patroon. Een case guard moet een Boole-expressie zijn. U geeft een hoofdletterbeveiliging op na het when
trefwoord dat een patroon volgt, zoals in het volgende voorbeeld wordt weergegeven:
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),
};
In het voorgaande voorbeeld worden eigenschapspatronen met geneste var-patronen gebruikt.
Niet-volledige switchexpressies
Als geen van de patronen van een switch
expressie overeenkomt met een invoerwaarde, genereert de runtime een uitzondering. In .NET Core 3.0 en latere versies is de uitzondering een System.Runtime.CompilerServices.SwitchExpressionException. In .NET Framework is de uitzondering een InvalidOperationException. In de meeste gevallen genereert de compiler een waarschuwing als een switch
expressie niet alle mogelijke invoerwaarden verwerkt. Lijstpatronen genereren geen waarschuwing wanneer alle mogelijke invoer niet wordt verwerkt.
Tip
Als u wilt garanderen dat een switch
expressie alle mogelijke invoerwaarden verwerkt, geeft u een switch
expressiearm met een verwijderingspatroon op.
C#-taalspecificatie
Zie de switch
expressiesectie van de notitie van het functievoorstel voor meer informatie.