switch 식 - switch 키워드를 사용하는 패턴 일치 식

switch 식을 사용하여 입력 식과의 패턴 일치를 기반으로 후보 식 목록에서 단일 식을 계산합니다. 하나의 문 컨텍스트에서 switch와 유사한 의미 체계를 지원하는 switch 문에 대한 자세한 내용은 선택 문 문서의 switch 섹션을 참조하세요.

다음 예제에서는 온라인 맵의 시각적 방향을 나타내는 enum의 값을 해당하는 카디널 방향으로 변환하는 switch 식을 보여 줍니다.

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

위의 예제에서는 다음과 같은 switch 식의 기본 요소를 보여 줍니다.

  • 뒤에 switch 키워드가 있는 식. 위의 예제에서는 direction 메서드 매개 변수입니다.
  • 쉼표로 구분된 ‘switch 식 암(arm)’입니다.switch 식 암(arm)에는 ‘패턴’, 선택적 ‘케이스 가드’, => 토큰, ‘식’이 포함됩니다.

위의 예제에서 switch 식은 다음 패턴을 사용합니다.

  • 상수 패턴: Direction 열거형의 정의된 값을 처리합니다.
  • 무시 패턴: Direction 열거형의 해당 멤버가 없는 정수 값(예: (Direction)10)을 처리합니다. 이로 인해 switch 식이 완전해집니다.

Important

switch 식에서 지원되는 패턴 및 추가 예제에 관한 정보는 패턴을 참조하세요.

switch 식의 결과는 패턴이 입력 식과 일치하고 케이스 가드(있는 경우)가 true로 평가되는 첫 번째 switch 식 암(arm)의 식 값입니다. switch 식 암(arm)은 텍스트 순서대로 계산됩니다.

상위 switch switch 식 암(arm)이 모든 값과 일치하므로 하위 switch 식 암(arm)을 선택할 수 없는 경우 컴파일러에서 오류가 발생합니다.

케이스 가드

패턴은 암(arm)의 식 평가 조건을 지정하기에 충분한 표현력이 없을 수 있습니다. 이 경우 케이스 가드를 사용할 수 있습니다. 케이스 가드는 일치하는 패턴과 함께 충족되어야 하는 추가 조건입니다. 케이스 가드는 부울 식이어야 합니다. 다음 예제와 같이 패턴 뒤에 있는 when 키워드 뒤에 케이스 가드를 지정합니다.

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

위의 예제에서는 속성 패턴과 함께 중첩된 var 패턴을 사용합니다.

불완전 switch 식

switch 식 패턴 중 입력 값과 일치하는 게 없으면 런타임은 예외를 throw합니다. .NET Core 3.0 이상 버전에서 예외는 System.Runtime.CompilerServices.SwitchExpressionException입니다. .NET Framework에서 예외는 InvalidOperationException입니다. 대부분의 경우 switch 식이 가능한 모든 입력 값을 처리하지 않는 경우 컴파일러에서 경고를 생성합니다. 목록 패턴은 가능한 모든 입력이 처리되지 않는 경우 경고를 생성하지 않습니다.

switch 식이 가능한 모든 입력 값을 처리하도록 보장하려면 switch 식 암(arm)에 무시 패턴을 제공합니다.

C# 언어 사양

자세한 내용은 기능 제안 노트switch 섹션을 참조하세요.

참고 항목