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 switchvoor 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 de direction methodeparameter.
  • De switch expressiearmen, gescheiden door komma's. Elke switch 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 de switch 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.

Zie ook