Partilhar via


Alternar expressão - Expressões de correspondência de padrões usando a switch palavra-chave

Use a expressão para avaliar uma única expressão a partir de uma lista de expressões candidatas switch com base em uma correspondência de padrão com uma expressão de entrada. Para obter informações sobre a switch instrução que oferece suporte à switchsemântica -like em um contexto de instrução, consulte aswitchseção de instrução do artigo Instruções de seleção.

O exemplo a seguir demonstra uma switch expressão, que converte valores de uma enum representação de direções visuais em um mapa online para as direções cardeais correspondentes:

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
    }
}

O exemplo anterior mostra os elementos básicos de uma switch expressão:

  • Uma expressão seguida da switch palavra-chave. No exemplo anterior, é o direction parâmetro method.
  • A switch expressão braços, separados por vírgulas. Cada switch braço de expressão contém um padrão, um protetor de caixa opcional, o => token e uma expressão.

No exemplo anterior, uma switch expressão usa os seguintes padrões:

  • Um padrão constante: para manipular os valores definidos da Direction enumeração.
  • Um padrão de descarte: para manipular qualquer valor inteiro que não tenha o membro correspondente da Direction enumeração (por exemplo, (Direction)10). Isso torna a switch expressão exaustiva.

Importante

Para obter informações sobre os padrões suportados switch pela expressão e mais exemplos, consulte Padrões.

O resultado de uma switch expressão é o valor da expressão do primeiro switch braço de expressão cujo padrão corresponde à expressão de entrada e cujo protetor de caso, se presente, é avaliado como true. Os switch braços de expressão são avaliados em ordem de texto.

O compilador gera um erro quando um braço de expressão inferior switch não pode ser escolhido porque um braço de expressão superior switch corresponde a todos os seus valores.

Protetores de caixa

Um padrão pode não ser expressivo o suficiente para especificar a condição para a avaliação da expressão de um braço. Nesse caso, você pode usar um protetor de caso. Um protetor de caixa é outra condição que deve ser satisfeita juntamente com um padrão correspondente. Um guarda-caso deve ser uma expressão booleana. Você especifica um protetor de caso após a when palavra-chave que segue um padrão, como mostra o exemplo a seguir:

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),
};

O exemplo anterior usa padrões de propriedade com padrões var aninhados.

Expressões de comutação não exaustivas

Se nenhum dos padrões de uma switch expressão corresponder a um valor de entrada, o tempo de execução lançará uma exceção. No .NET Core 3.0 e versões posteriores, a exceção é um System.Runtime.CompilerServices.SwitchExpressionExceptionarquivo . No .NET Framework, a exceção é um InvalidOperationExceptionarquivo . Na maioria dos casos, o compilador gera um aviso se uma switch expressão não manipular todos os valores de entrada possíveis. Os padrões de lista não geram um aviso quando todas as entradas possíveis não são tratadas.

Gorjeta

Para garantir que uma switch expressão manipule todos os valores de entrada possíveis, forneça um braço de switch expressão com um padrão de descarte.

Especificação da linguagem C#

Para obter mais informações, consulte a switch seção de expressão da nota de proposta de recurso.

Consulte também