11 패턴 및 패턴 일치
11.1 일반
패턴은 연산자(§12.12.12)와 is
switch_statement(§13.8.3)에서 들어오는 데이터를 비교할 데이터의 모양을 표현하는 데 사용할 수 있는 구문 형식입니다. 패턴은 switch 문의 식이나 연산자의 왼쪽 is
에 있는 relational_expression 대해 테스트되며, 각 패턴을 패턴 입력 값이라고 합니다.
11.2 패턴 양식
11.2.1 일반
패턴에는 다음 형식 중 하나가 있을 수 있습니다.
pattern
: declaration_pattern
| constant_pattern
| var_pattern
;
declaration_pattern 및 var_pattern 지역 변수 선언이 발생할 수 있습니다.
각 패턴 양식은 패턴이 적용될 수 있는 입력 값에 대한 형식 집합을 정의합니다. 패턴 P
이 일치할 수 있는 값이 있는 형식 T
중 하나이면 T
형식에 패턴이 적용됩니다. 적용할 수 없는 T
경우 형식의 패턴 입력 값(§11.1)T
과 일치하는 패턴 P
이 프로그램에 나타나는 경우 P
컴파일 시간 오류입니다.
예제: 다음 예제에서는 컴파일 시간 형식
v
TextReader
이 이므로 컴파일 시간 오류를 생성합니다. 형식TextReader
의 변수는 참조와 호환되는 값을 가질 수 없습니다.string
TextReader v = Console.In; // compile-time type of 'v' is 'TextReader' if (v is string) // compile-time error { // code assuming v is a string }
그러나 컴파일 시간 형식
v
object
은 다음과 같은 이유로 컴파일 시간 오류를 생성하지 않습니다. 형식object
의 변수에는 참조와 호환되는 값이 있을 수 있습니다.string
object v = Console.In; if (v is string s) { // code assuming v is a string }
끝 예제
각 패턴 폼은 패턴 이 런타임 시 값과 일치하는 값 집합을 정의합니다.
11.2.2 선언 패턴
declaration_pattern 사용하여 값에 지정된 형식이 있는지 테스트하고, 테스트가 성공하면 해당 형식의 변수에 값을 제공합니다.
declaration_pattern
: type simple_designation
;
simple_designation
: single_variable_designation
;
single_variable_designation
: identifier
;
값의 런타임 형식은 is-type 연산자(§12.12.12.1)에 지정된 것과 동일한 규칙을 사용하여 패턴의 형식에 대해 테스트됩니다. 테스트가 성공하면 패턴 이 해당 값과 일치 합니다. 형식이 nullable 값 형식(§8.3.12)인 경우 컴파일 시간 오류입니다. 이 패턴 형식은 값과 null
일치하지 않습니다.
참고: is-type 식
e is T
과 선언 패턴e is T _
은 nullable 형식이 아닌 경우T
동일합니다. 끝 메모
패턴 입력 값(§11.1) e가 지정된 경우 simple_designation 식별자_
이면 무시(§9.2.9.1)를 표시하고 e의 값은 아무것도 바인딩되지 않습니다. (이름이 _
지정된 선언된 변수가 해당 시점에 범위에 있을 수 있지만 해당 명명된 변수는 이 컨텍스트에서 볼 수 없습니다.) simple_designation 다른 식별자인 경우 지정된 식별자가 명명한 지정된 형식의 지역 변수(§9.2.9)가 도입됩니다. 해당 지역 변수는 패턴이 값과 일치할 때 패턴 입력 값의 값이 할당됩니다.
패턴 입력 값과 지정된 형식의 정적 형식의 특정 조합은 호환되지 않는 것으로 간주되어 컴파일 시간 오류가 발생합니다. 정적 형식 E
의 값은 ID 변환, 암시적 또는 명시적 참조 변환, boxing 변환 또는 언박싱 T
E
변환이 있거나 열려 있는 형식T
(§8.4.3)이 있는 경우 T
E
형식과 호환되는 패턴이라고 합니다. 형식 T
의 이름을 지정하는 선언 패턴은 패턴과 T
호환되는 E
모든 형식 E
에 적용할 수 있습니다.
참고: 열린 형식에 대한 지원은 구조체 또는 클래스 형식일 수 있는 형식을 검사할 때 가장 유용할 수 있으며 boxing은 피해야 합니다. 끝 메모
예: 선언 패턴은 참조 형식의 런타임 형식 테스트를 수행하는 데 유용하며 관용구를 대체합니다.
var v = expr as Type; if (v != null) { /* code using v */ }
약간 더 간결한
if (expr is Type v) { /* code using v */ }
끝 예제
형식이 nullable 값 형식인 경우 오류입니다.
예: 선언 패턴을 사용하여 null 허용 형식의 값을 테스트할 수 있습니다. 형식
Nullable<T>
값(또는 boxedT
)은 값이 null이 아니고 null이 아니면 형식 패턴T2 id
과T2
T
일치하거나 일부 기본 형식 또는 인터페이스와T
일치합니다. 예를 들어 코드 조각에서int? x = 3; if (x is int v) { /* code using v */ }
명령문
true
의if
조건은 런타임에 있으며 변수v
는 블록 내의 형식int
값을3
보유합니다. 끝 예제
11.2.3 상수 패턴
constant_pattern 지정된 상수 값에 대해 패턴 입력 값(§11.1)의 값을 테스트하는 데 사용됩니다.
constant_pattern
: constant_expression
;
상수 패턴 P
은 상수 식에서 형식 T
으로의 P
암시적 변환이 있는 경우 형식에 적용할 수 있습니다T
.
상수 패턴P
의 경우 변환된 값은
- 패턴 입력 값의 형식이 정수 형식 또는 열거형 형식이면 패턴의 상수 값이 해당 형식으로 변환됩니다. 그렇지 않으면
- 패턴 입력 값의 형식이 정수 계열 형식 또는 열거형 형식의 nullable 버전이면 패턴의 상수 값이 기본 형식으로 변환됩니다. 그렇지 않으면
- 패턴의 상수 값 값입니다.
패턴 입력 값 e 및 변환된 값 v가 있는 상수 패턴 P
이 지정된 경우
- e에 정수 계열 형식 또는 열거형 형식 또는 해당 형식 중 하나의 nullable 형식이 있고 v에 정수 계열 형식이 있는 경우 패턴
P
은true
식e == v
의 결과가 e 값과 일치합니다. 그렇지 않으면 - 패턴
P
은 반환하는 경우object.Equals(e, v)
e 값과 일치합니다true
.
예: 다음 메서드의 문은
switch
대/소문자 레이블에 5개의 상수 패턴을 사용합니다.static decimal GetGroupTicketPrice(int visitorCount) { switch (visitorCount) { case 1: return 12.0m; case 2: return 20.0m; case 3: return 27.0m; case 4: return 32.0m; case 0: return 0.0m; default: throw new ArgumentException(...); } }
끝 예제
11.2.4 Var 패턴
var_pattern 모든 값과 일치합니다. 즉, var_pattern 패턴 일치 작업은 항상 성공합니다.
var_pattern 모든 형식에 적용할 수 있습니다.
var_pattern
: 'var' designation
;
designation
: simple_designation
;
패턴 입력 값(§11.1) e가 지정된 경우 지정이 식별자_
이면 무시(§9.2.9.1)를 표시하며 e 값은 아무것도 바인딩되지 않습니다. (해당 이름의 선언된 변수가 해당 시점에 범위에 있을 수 있지만 명명된 변수는 이 컨텍스트에서 볼 수 없습니다.) 지정이 다른 식별자인 경우 런타임에 e의 값은 해당 형식이 e의 정적 형식이고 패턴 입력 값이 해당 지역 변수에 할당되는 해당 이름의 새로 도입된 지역 변수(§9.2.9)에 바인딩됩니다.
이름이 var
var_pattern 사용되는 형식에 바인딩하는 경우 오류가 발생합니다.
11.3 패턴 하위 요소
switch 문에서 앞의 보호되지 않은 사례 집합(§13.8.3)에 의해 사례 패턴이 하위화되면 오류가 발생합니다. 비공식적으로 이는 입력 값이 이전 사례 중 하나와 일치했음을 의미합니다. 다음 규칙은 패턴 집합이 지정된 패턴을 하위로 사용하는 경우를 정의합니다.
패턴 P
의 런타임 동작에 대한 사양이 일치하는 경우 패턴은 P
상수 K
와 일치K
합니다.
패턴 집합은 Q
다음 조건이 있는 경우 패턴을 P
하위로 설정합니다.
P
는 상수 패턴이며 집합Q
의 모든 패턴이 '의 변환된 값과 일치P
합니다.P
은 var 패턴이고 패턴Q
입력 값의 형식(§11.1)에 대해 패턴 집합이 완전하고(§11.4) 패턴 입력 값이 nullable 형식이 아니거나 일부 패턴Q
이 일치null
합니다.P
는 형식T
이 있는 선언 패턴이며 패턴Q
집합은 형식T
에 대해 완전합니다(§11.4).
11.4 패턴 완전성
비공식적으로, null 이외의 해당 형식의 가능한 모든 값에 대해 집합의 일부 패턴을 적용할 수 있는 경우 형식에 대해 패턴 집합이 완전합니다. 다음 규칙은 패턴 집합이 형식에 대해 완전할 때를 정의합니다.
다음 조건이 있는 경우 형식 T
에 대해 패턴 Q
집합이 완전합니다.
T
은 정수 또는 열거형 형식이거나 그 중 하나의 nullable 버전이며, nullable이 아닌 기본 형식의T
가능한 모든 값에Q
대해 일부 패턴이 해당 값과 일치합니다.- 일부 패턴
Q
은 var 패턴입니다. - 일부 패턴은 형식에
Q
대한 선언 패턴이며 ID 변환, 암시적 참조 변환 또는 boxing 변환이T
있습니다D
.D
예제:
static void M(byte b) { switch (b) { case 0: case 1: case 2: ... // handle every specific value of byte break; // error: the pattern 'byte other' is subsumed by the (exhaustive) // previous cases case byte other: break; } }
끝 예제
ECMA C# draft specification