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
식 섹션을 참조하세요.
참고 항목
.NET