Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Gebruik de switch expressie om één expressie te evalueren uit een lijst met kandidaat-expressies. De evaluatie is gebaseerd op een patroonovereenkomst met een invoerexpressie. Zie switch instructiesectie van het artikel switch voor informatie over de switch instructie die ondersteuning biedt voor semantiek in een instructiecontext.
De C#-taalreferentiedocumenten beschrijven de meest recent uitgebrachte versie van de C#-taal. Het bevat ook de eerste documentatie voor functies in openbare previews voor de aanstaande taalrelease.
De documentatie identificeert alle functies die voor het eerst zijn geïntroduceerd in de laatste drie versies van de taal of in de huidige openbare previews.
Aanbeveling
Raadpleeg het artikel over de versiegeschiedenis van de C#-taal om te achterhalen wanneer een functie voor het eerst is geïntroduceerd in C#.
In het volgende voorbeeld ziet u een switch expressie. Hiermee worden waarden van een enum visuele routebeschrijving in een onlinekaart 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
switchtrefwoord. In het voorgaande voorbeeld is dit dedirectionmethodeparameter. - De
switchexpressiearmen, gescheiden door komma's. Elkeswitchexpressiearm 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
Directionopsomming. - Een verwijderingspatroon: als u een geheel getal wilt verwerken dat niet het bijbehorende lid van de
Directionopsomming heeft (bijvoorbeeld(Direction)10). Dit patroon maakt deswitchexpressie volledig.
Belangrijk
Zie switch voor meer informatie over de patronen die worden ondersteund door de 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 is mogelijk niet expressief genoeg om de voorwaarde voor de evaluatie van de expressie van een arm op te geven. Gebruik in dat geval een case guard. Een case guard is een andere voorwaarde waaraan moet worden voldaan samen met een overeenkomend patroon. Een case guard moet een Boole-expressie zijn. Geef een case-guard 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.
Aanbeveling
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 C#-taalspecificatie voor meer informatie.