다음을 통해 공유


열거형 19개

19.1 일반

열거형 형식은 명명된 상수 집합을 선언하는 고유 값 형식(§8.3)입니다.

예: 예제

enum Color
{
    Red,
    Green,
    Blue
}

는 멤버GreenRed와 함께 명명된 Color 열거형 형식을 선언합니다Blue.

끝 예제

19.2 열거형 선언

열거형 선언은 새 열거형 형식을 선언합니다. 열거형 선언은 키워드 enum로 시작하고 열거형의 이름, 접근성, 기본 형식 및 멤버를 정의합니다.

enum_declaration
    : attributes? enum_modifier* 'enum' identifier enum_base? enum_body ';'?
    ;

enum_base
    : ':' integral_type
    | ':' integral_type_name
    ;

integral_type_name
    : type_name // Shall resolve to an integral type other than char
    ;

enum_body
    : '{' enum_member_declarations? '}'
    | '{' enum_member_declarations ',' '}'
    ;

각 열거형 형식에는 열거형 형식의 기본 형식이라고 하는 해당 정수 계열 형식 이 있습니다. 이 기본 형식은 열거형에 정의된 모든 열거자 값을 나타낼 수 있어야 합니다. enum_base 있으면 기본 형식을 명시적으로 선언합니다. 기본 형식은 을 제외한 정수 계열 형식 (§8.3.6) char중 하나여야 합니다. 기본 형식 integral_type 은 (§8.3.5) 또는 integral_type_name. using integral_type_name 지시문(§14.5)을 고려하는 것을 포함하여 (§7.8.1)과 동일한 방식으로 type_name 해결됩니다.

참고: 형식은 char 키워드 또는 를 통해 integral_type_name기본 형식으로 사용할 수 없습니다. 끝 메모

내부 형식을 명시적으로 선언하지 않는 열거형 선언에는 기본 형식이 int있습니다.

: 예제

enum Color : long
{
    Red,
    Green,
    Blue
}

는 기본 형식 long의 열거형을 선언합니다.

끝 예제

참고: 개발자는 예제와 같이 기본 형식 long을 사용하여 범위에 long 있지만 범위 int가 아닌 값을 사용하도록 설정하거나 나중에 이 옵션을 유지하도록 선택할 수 있습니다. 끝 메모

참고: C#에서는 array_initializer 쉼표(§17.7)를 허용하는 것처럼 enum_body 후행 쉼표가 허용됩니다. 끝 메모

열거형 선언에는 형식 매개 변수 목록을 포함할 수 없지만, 제네릭 클래스 선언 또는 제네릭 구조체 선언 내에 중첩된 열거형은 제네릭 열거형 선언이므로 포함된 형식에 대한 형식 인수는 생성된 형식(§8.4)을 만들도록 제공해야 합니다.

19.3 열거형 한정자

enum_declaration 필요에 따라 열거형 한정자 시퀀스를 포함할 수 있습니다.

enum_modifier
    : 'new'
    | 'public'
    | 'protected'
    | 'internal'
    | 'private'
    ;

동일한 한정자가 열거형 선언에 여러 번 표시되는 것은 컴파일 시간 오류입니다.

열거형 선언의 한정자는 클래스 선언(§15.2.2)과 동일한 의미를 갖습니다. 그러나 abstract열거형 선언에는 , 및 static sealed한정자가 허용되지 않습니다. 열거형은 추상적일 수 없으며 파생을 허용하지 않습니다.

19.4 열거형 멤버

열거형 형식 선언의 본문은 열거형 형식의 명명된 상수인 0개 이상의 열거형 멤버를 정의합니다. 두 열거형 멤버는 같은 이름을 가질 수 없습니다.

enum_member_declarations
    : enum_member_declaration (',' enum_member_declaration)*
    ;
enum_member_declaration
    : attributes? identifier ('=' constant_expression)?
    ;

각 열거형 멤버에는 연결된 상수 값이 있습니다. 이 값의 형식은 포함하는 열거형의 기본 형식입니다. 각 열거형 멤버의 상수 값은 열거형의 기본 형식 범위에 있어야 합니다.

: 예제

enum Color: uint
{
    Red = -1,
    Green = -2,
    Blue = -3
}

상수 값 -1-2-3 이 내부 정수 형식uint의 범위에 없기 때문에 컴파일 시간 오류가 발생합니다.

끝 예제

여러 열거형 멤버는 동일한 연결된 값을 공유할 수 있습니다.

: 예제

enum Color
{
    Red,
    Green,
    Blue,
    Max = Blue
}

는 두 열거형 멤버BlueMax연결된 값이 같은 열거형을 표시합니다.

끝 예제

열거형 멤버의 연결된 값은 암시적 또는 명시적으로 할당됩니다. 열거형 멤버 의 선언에 constant_expression 이니셜라이저가 있는 경우 열거형의 내부 형식으로 암시적으로 변환된 해당 상수 식의 값은 열거형 멤버의 연결된 값입니다. 열거형 멤버의 선언에 이니셜라이저가 없으면 다음과 같이 연결된 값이 암시적으로 설정됩니다.

  • 열거형 멤버가 열거형 형식에서 선언된 첫 번째 열거형 멤버인 경우 연결된 값은 0입니다.
  • 그렇지 않은 경우 열거형 멤버의 연결된 값은 텍스트 앞에 오는 열거형 멤버의 연결된 값을 1씩 늘려 가져옵니다. 이 증가된 값은 기본 형식으로 나타낼 수 있는 값 범위 내에 있어야 합니다. 그렇지 않으면 컴파일 시간 오류가 발생합니다.

: 예제

enum Color
{
    Red,
    Green = 10,
    Blue
}

class Test
{
    static void Main()
    {
        Console.WriteLine(StringFromColor(Color.Red));
        Console.WriteLine(StringFromColor(Color.Green));
        Console.WriteLine(StringFromColor(Color.Blue));
    }

    static string StringFromColor(Color c)
    {
        switch (c)
        {
            case Color.Red:
                return $"Red = {(int) c}";
            case Color.Green:
                return $"Green = {(int) c}";
            case Color.Blue:
                return $"Blue = {(int) c}";
            default:
                return "Invalid color";
      }
   }
}

는 열거형 멤버 이름과 연결된 값을 출력합니다. 출력은 다음과 같습니다.

Red = 0
Green = 10
Blue = 11

다음과 같은 이유로 다음을 수행합니다.

  • 열거형 멤버는 이니셜라이저가 없고 첫 번째 열거형 멤버 Red 이므로 값 0이 자동으로 할당됩니다.
  • 열거형 멤버 Green 에는 명시적으로 값 10이 지정됩니다.
  • 열거형 멤버 Blue 는 텍스트로 앞에 오는 멤버보다 큰 값을 자동으로 할당합니다.

끝 예제

열거형 멤버의 관련 값은 직접 또는 간접적으로 연결된 열거형 멤버의 값을 사용하지 않습니다. 이 순환 제한 이외에 열거형 멤버 이니셜라이저는 텍스트 위치에 관계없이 다른 열거형 멤버 이니셜라이저를 자유롭게 참조할 수 있습니다. 열거형 멤버 이니셜라이저 내에서 다른 열거형 멤버의 값은 항상 기본 형식의 형식을 갖는 것으로 처리되므로 다른 열거형 멤버를 참조할 때 캐스트가 필요하지 않습니다.

: 예제

enum Circular
{
    A = B,
    B
}

는 선언이 순환이므로 컴파일 시간 오류가 발생합니다 A B . A 는 명시적으로 의존 B 하며 B 암시적으로 의존 A 합니다.

끝 예제

열거형 멤버는 클래스 내의 필드와 정확히 유사한 방식으로 명명되고 범위가 지정됩니다. 열거형 멤버의 범위는 포함하는 열거형 형식의 본문입니다. 해당 범위 내에서 열거형 멤버는 단순 이름으로 참조할 수 있습니다. 다른 모든 코드에서 열거형 멤버의 이름은 열거형 형식의 이름으로 한정되어야 합니다. 열거형 멤버에는 선언된 접근성이 없습니다. 포함된 열거형 형식에 액세스할 수 있는 경우 열거형 멤버에 액세스할 수 있습니다.

19.5 System.Enum 형식

형식 System.Enum 은 모든 열거형 형식의 추상 기본 클래스이며(이 클래스는 열거형 형식의 기본 형식과 다르며), 상속된 System.Enum 멤버는 모든 열거형 형식에서 사용할 수 있습니다. boxing 변환(§10.2.9)은 열거형 형식에서 모든 열거형 형식으로 System.Enum존재하며 unboxing 변환(§10.3.7)이 모든 열거형 형식으로 System.Enum 존재합니다.

System.Enum 자체가 enum_type 아닙니다. 오히려 모든 enum_type 파생되는 class_type. 형식 System.Enum 은 형식 System.ValueType (§8.3.2)에서 상속되며, 형식에서 object상속됩니다. 런타임에 형식 값은 열거형 형식 System.Enum 의 boxed 값에 대한 참조일 null 수 있습니다.

19.6 열거형 값 및 작업

각 열거형 형식은 고유 형식을 정의합니다. 열거형 형식과 정수 형식 간 또는 두 열거형 형식 간에 변환하려면 명시적 열거형 변환(§10.3.3)이 필요합니다. 열거형 형식의 값 집합은 기본 형식의 값 집합과 동일하며 명명된 상수의 값으로 제한되지 않습니다. 열거형의 기본 형식 값은 열거형 형식으로 캐스팅할 수 있으며 해당 열거형 형식의 고유한 유효한 값입니다.

열거형 멤버는 포함하는 열거형 형식의 형식을 갖습니다(다른 열거형 멤버 이니셜라이저 내 제외: §19.4 참조). 연결된 값을 사용하여 열거형 형식 E 으로 선언된 열거형 멤버의 값 v 입니다 (E)v.

다음 연산자는 열거형 형식의 값에 사용할 수 있습니다.

모든 열거형 형식은 클래스 System.Enum 에서 자동으로 파생됩니다(차례로 파생 System.ValueTypeobject파생). 따라서 이 클래스의 상속된 메서드와 속성을 열거형 형식의 값에 사용할 수 있습니다.