Favicon

Switch expression

Peponi1/7/20253m

C#
SyntaxExpressionswitch

1. Introduction

switch 식은 패턴 매칭을 기반으로 식을 계산한다. (switch 문은 Switch statement을 참조한다)

switch 식은 다음과 같이 구성한다.

x switch
{
    condition1 => value1,
    condition2 => value2
};
  • x : 입력 값
  • 스위치 암 (arm) : ,로 구분 된 각각의 식
    • condition : 조건 (패턴 또는 케이스 가드)
    • value : 반환 식

switch 식의 결과는 조건이 true로 반환되는 첫번째 arm 반환 식의 값이다. (상위 arm으로 인해 하위 arm의 값 출력이 불가한 경우 컴파일러에서 오류가 발생한다) switch 식에 사용 가능한 패턴은 아래 목록을 참조한다.

  1. Type, declaration patterns
  2. Constant pattern
  3. Relational patterns
  4. Logical patterns
  5. Property, positional patterns
  6. Discard, var patterns
  7. List pattern

2. Example

int foo = 1;
string bar = foo switch
{
    0 => "Zero",
    1 => "One",
    2 => "Two"
};
 
Console.WriteLine(bar);
 
/* output:
One
*/

3. 불완전 switch 식

.NET 런타임은 switch식의 패턴과 입력 값이 일치하지 않는 경우 System.Runtime.CompilerServices.SwitchExpressionException 예외를 출력하며 입력 가능한 모든 값을 처리하지 않는 switch 식이 선언되는 경우 컴파일러는 CS8509를 생성한다.

위의 예시 코드 또한 마찬가지의 경우로, 아래와 같이 무시 패턴 (_)을 이용하여 모든 입력 값을 처리하도록 할 수 있다.

int foo = 10;
string bar = foo switch
{
    0 => "Zero",
    1 => "One",
    2 => "Two",
    _ => "Don't know"
};
 
Console.WriteLine(bar);
 
/* output:
Don't know
*/

4. 케이스 가드

패턴이 조건 평가에 맞지 않은 경우 케이스 가드를 사용하여 세부 조건을 설정할 수 있다.

(int X, int Y) XY = (3, 4);
string foo = XY switch
{
    { X: 0, Y: 0 } => "Both are 0",
    { X: > 0, Y: > 0 } => "Both are bigger than 0",
    { X: var x, Y: var y } when x < y => "Y is bigger than X"
};
 
Console.WriteLine(foo);
 
/* output:
Both bigger than 0
*/

5. 참조 자료