다음을 통해 공유


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 경우 식은 모든 대/소문자 형식을 처리할 때 완전합니다. 모든 팔이 필요하지 않습니다. 공용 구조체 속성의 Value null 상태가 "null일 수 있음"인 경우 경고를 방지하기 위해 처리 null 해야 합니다. 자세한 내용은 Union 완전성을 참조하세요.

팁 (조언)

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

C# 언어 사양

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

참고하십시오