다음을 통해 공유


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_patternvar_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 변환 또는 언박싱 TE 변환이 있거나 열려 있는 형식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> 값(또는 boxed T)은 값이 null이 아니고 null이 아니면 형식 패턴 T2 idT2 T일치하거나 일부 기본 형식 또는 인터페이스와 T일치합니다. 예를 들어 코드 조각에서

int? x = 3;
if (x is int v) { /* code using v */ }

명령문 trueif 조건은 런타임에 있으며 변수 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 truee == 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 집합이 완전합니다.

  1. T 은 정수 또는 열거형 형식이거나 그 중 하나의 nullable 버전이며, nullable이 아닌 기본 형식의 T가능한 모든 값에 Q 대해 일부 패턴이 해당 값과 일치합니다.
  2. 일부 패턴 Qvar 패턴입니다.
  3. 일부 패턴은 형식에 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;
    }
}

끝 예제