다음을 통해 공유


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

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

C# 언어 참조는 가장 최근에 릴리스된 C# 언어 버전을 문서화합니다. 또한 예정된 언어 릴리스의 공개 미리 보기 기능에 대한 초기 설명서도 포함되어 있습니다.

설명서는 언어의 마지막 세 버전 또는 현재 공개 미리 보기에서 처음 도입된 기능을 식별합니다.

팁 (조언)

C#에서 기능이 처음 도입된 시기를 찾으려면 C# 언어 버전 기록에 대한 문서를 참조하세요.

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

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 .
  • 쉼표로 구분된 식 암입니다.switchswitch 식 암에는 패턴, 선택적 케이스 가드, => 토큰 및 이 포함됩니다.

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

중요합니다

식에서 지원하는 패턴 및 더 많은 예제에 switch 대한 자세한 내용은 패턴을 참조하세요.

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

컴파일러는 더 높은 switch 식 암이 모든 값과 일치하기 때문에 더 낮은 switch 식 암을 선택할 수 없는 경우 오류를 생성합니다.

케이스 가드

패턴이 암 식의 평가 조건을 지정할 만큼 표현되지 않을 수 있습니다. 이러한 경우 케이스 가드를 사용합니다. 케이스 가드는 일치하는 패턴과 함께 충족해야 하는 또 다른 조건입니다. 대/소문자 보호는 부울 식이어야 합니다. 다음 예제와 같이 패턴을 따르는 키워드 뒤에 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 식의 패턴이 입력 값과 일치하지 않는 경우 런타임은 예외를 throw합니다. .NET Core 3.0 이상 버전에서는 예외가 있습니다 System.Runtime.CompilerServices.SwitchExpressionException. .NET Framework에서 예외는 .입니다 InvalidOperationException. 대부분의 경우 식이 가능한 모든 입력 값을 처리하지 않는 경우 switch 컴파일러는 경고를 생성합니다. 목록 패턴은 가능한 모든 입력이 처리되지 않는 경우 경고를 생성하지 않습니다.

팁 (조언)

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

C# 언어 사양

자세한 내용은 switch의 식 섹션을 참조 하세요.

참고하십시오