다음을 통해 공유


전역 사용 지시문

메모

이 문서는 기능 사양입니다. 사양은 기능의 디자인 문서 역할을 합니다. 여기에는 기능 디자인 및 개발 중에 필요한 정보와 함께 제안된 사양 변경 내용이 포함됩니다. 이러한 문서는 제안된 사양 변경이 완료되고 현재 ECMA 사양에 통합될 때까지 게시됩니다.

기능 사양과 완료된 구현 간에 약간의 불일치가 있을 수 있습니다. 이러한 차이는관련 LDM(언어 디자인 모임) 노트에서 캡처됩니다.

사양문서에서 C# 언어 표준으로 기능 사양을 채택하는 프로세스에 대해 자세히 알아볼 수 있습니다.

using 지시문의 구문은 using 키워드 앞에 올 수 있는 선택적인 global 키워드로 확장됩니다.

compilation_unit
    : extern_alias_directive* global_using_directive* using_directive* global_attributes? namespace_member_declaration*
    ;

global_using_directive
    : global_using_alias_directive
    | global_using_namespace_directive
    | global_using_static_directive
    ;

global_using_alias_directive
    : 'global' 'using' identifier '=' namespace_or_type_name ';'
    ;

global_using_namespace_directive
    : 'global' 'using' namespace_name ';'
    ;
    
global_using_static_directive
    : 'global' 'using' 'static' type_name ';'
    ;
  • global_using_directive는 컴파일 단위 수준에서만 허용되며, namespace_declaration내에서는 사용할 수 없습니다.
  • global_using_directive가 있을 경우, 반드시 using_directive보다 앞에 있어야 합니다.
  • global_using_directive의 범위는 프로그램 내 모든 컴파일 단위의 namespace_member_declaration에 걸쳐 확장됩니다. global_using_directive의 범위는 다른 global_using_directive를 포함하지 않습니다. 따라서 동료 global_using_directive또는 다른 컴파일 단위에서의 동료는 서로 영향을 미치지 않으며, 그것들이 작성되는 순서는 중요하지 않습니다. global_using_directive의 범위에는 특히 프로그램의 컴파일 단위에 포함된 using_directive가 포함되지 않습니다.

프로그램에 global_using_directive을 추가하는 효과는 프로그램의 모든 컴파일 단위에 동일한 대상 네임스페이스 또는 형식으로 해결되는 유사한 using_directive을 추가하는 효과와 같습니다. 그러나 global_using_directive의 목표는 그것이 포함된 컴파일 단위의 컨텍스트에서 해석됩니다.

§7.7 범위

다음은 굵은 글씨로 표시된 제안된 추가 사항이 포함된 관련 글머리 기호입니다 ().

  • extern_alias_directive에 의해 정의된 이름의 범위는 즉시 포함된 컴파일 단위 또는 네임스페이스 본문에서의 global_using_directive들,using_directive들, global_attributesnamespace_member_declaration들의 범위로 확장됩니다. extern_alias_directive 기본 선언 공간에 새 멤버를 추가하지 않습니다. 즉, extern_alias_directive 전이적이 아니라 컴파일 단위 또는 발생하는 네임스페이스 본문에만 영향을 줍니다.
  • global_using_directive에 의해 정의되거나 가져온 이름의 범위는 프로그램의 모든 compilation_unit에 있는 global_attributesnamespace_member_declaration에 걸쳐 확장됩니다.

§7.8 네임스페이스 및 타입 이름

namespace_or_type_name의 의미를 결정하는 알고리즘이 다음과 같이 변경되었습니다.

이것은 제안된 추가(굵은)가 있는 관련 글머리 기호입니다.

  • namespace_or_type_name이/가 I 형식이거나 I<A1, ..., Ak>형식의 경우:
    • K 0이고 namespace_or_type_name 제네릭 메서드 선언(§15.6) 속에 나타나고, 그 선언에 이름이 I인 형식 매개 변수(§15.2.3)가 포함되어 있으면, namespace_or_type_name라는 것이 해당 형식 매개 변수를 참조합니다.
    • 다른 경우에는 namespace_or_type_name이 형식 선언 내에 나타나면, 각 인스턴스 형식 T(§15.3.2)에 대해 그 형식 선언의 인스턴스 형식에서 시작하여 각 바깥쪽 클래스 또는 구조체 선언의 인스턴스 형식으로 계속 진행됩니다(있는 경우).
      • K 0이고 T 선언에 이름 I있는 형식 매개 변수가 포함된 경우 namespace_or_type_name 해당 형식 매개 변수를 참조합니다.
      • 그렇지 않은 경우, namespace_or_type_name이 형식 선언 본문 내에 나타나고, T 또는 해당 기본 형식 중 이름이 I이고 K 형식 매개변수를 가진 중첩된 접근 가능한 형식을 포함하고 있다면, namespace_or_type_name은 지정된 형식 인수를 사용하여 구성된 해당 형식을 참조합니다. 이러한 형식이 두 개 이상 있는 경우 더 많은 파생 형식 내에서 선언된 형식이 선택됩니다. 형식이 아닌 멤버(상수, 필드, 메서드, 속성, 인덱서, 연산자, 인스턴스 생성자, 소멸자 및 정적 생성자) 및 형식 매개 변수 수가 다른 형식 멤버는 namespace_or_type_name의미를 결정할 때 무시됩니다.
    • 이전 단계가 실패한 경우 각 네임스페이스 N에 대해 namespace_or_type_name이(가) 있는 네임스페이스부터 시작하여, 각 바깥쪽 네임스페이스(있는 경우)를 계속 진행하며, 전역 네임스페이스에서 끝낼 때까지 다음 단계가 평가됩니다. 엔터티가 찾아질 때까지 계속 평가합니다.
      • K 0이고 IN네임스페이스의 이름인 경우 다음을 수행합니다.
        • namespace_or_type_name 발생하는 위치가 N 대한 네임스페이스 선언으로 묶이고 네임스페이스 선언에 네임스페이스 또는 형식과 이름 I 연결하는 extern_alias_directive 또는 using_alias_directive 포함된 경우 또는 프로그램에서 N 대한 네임스페이스 선언에는 이름 I 네임스페이스 또는 형식과 연결하는 global_using_alias_directive 포함됩니다. namespace_or_type_name 모호하고 컴파일 시간 오류가 발생합니다.
        • 그렇지 않으면 namespace_or_type_nameNI라는 네임스페이스를 참조합니다.
      • 그렇지 않은 경우, N에 이름이 I이고 형식 매개변수가 K인 액세스 가능한 형식이 포함되어 있다면, 다음을 수행합니다.
        • K 0이고 namespace_or_type_name 발생하는 위치가 N 대한 네임스페이스 선언으로 묶이고 네임스페이스 선언에 이름 I 네임스페이스 또는 형식과 연결하는 extern_alias_directive 또는 using_alias_directive 포함된 경우, 또는 프로그램에서 N 대한 네임스페이스 선언에는 이름 I 연결하는 global_using_alias_directive 포함됩니다. 네임스페이스 또는 형식을namespace_or_type_name 모호하고 컴파일 시간 오류가 발생합니다.
        • 그 경우에 namespace_or_type_name은 지정된 형식 인수로 생성된 형식을 참조합니다.
      • 그렇지 않으면 namespace_or_type_name 발생하는 위치가 N대한 네임스페이스 선언으로 묶인 경우:
        • K 0이고 네임스페이스 선언에 이름 I 가져온 네임스페이스 또는 형식과 연결하는 extern_alias_directive 또는 using_alias_directive 포함된 경우 또는 프로그램에서 N 대한 네임스페이스 선언에는 이름 I 가져온 네임스페이스 또는 형식과 연결하는 global_using_alias_directive 포함됩니다. namespace_or_type_name 해당 네임스페이스 또는 형식을 참조합니다.
        • 만약 그렇지 않으면, 네임스페이스 선언 using_namespace_directiveusing_alias_directive를 통해 가져온 네임스페이스 및 형식 선언과, 프로그램에서 N에 대한 네임스페이스 선언의 global_using_namespace_directiveglobal_using_static_directive를 통해 가져온 네임스페이스 및 형식 선언에 이름 IK 형식 매개변수가 있는 접근 가능한 형식이 정확히 하나 포함되어 있다면, 그러면 namespace_or_type_name는 지정된 형식 인수를 사용하여 생성된 해당 형식을 참조합니다.
        • 그렇지 않으면 네임스페이스 선언 using_namespace_directiveusing_alias_directive통해 가져온 네임스페이스 및 형식 선언과 프로그램N 대한 네임스페이스 선언의 global_using_namespace_directiveglobal_using_static_directiveglobal_using_static_directive네임스페이스 선언에서 가져온 네임스페이스 및 형식 선언에 이름 IK 형식 매개 변수가 있는 액세스 가능한 형식이 둘 이상 포함되어 있는 경우 그러면 namespace_or_type_name 모호하고 오류가 발생합니다.
    • 그렇지 않으면 namespace_or_type_name 정의되지 않고 컴파일 시간 오류가 발생합니다.

간단한 이름 §12.8.4

다음과 같이 simple_name 평가 규칙이 변경됩니다.

이것은 제안된 추가(굵은)가 있는 관련 글머리 기호입니다.

  • 그렇지 않으면 각 네임스페이스 N에 대해, 단순_이름이 발생하는 네임스페이스부터 시작하여, 각 바깥쪽 네임스페이스(있는 경우라면)를 거쳐 전역 네임스페이스에 이르기까지, 엔터티가 위치할 때까지 다음 단계가 차례로 평가됩니다.
    • K 0이고 IN네임스페이스의 이름인 경우 다음을 수행합니다.
      • simple_name 발생하는 위치가 N 대한 네임스페이스 선언으로 묶이고 네임스페이스 선언에 이름 I 네임스페이스 또는 형식과 연결하는 extern_alias_directive 또는 using_alias_directive 포함된 경우, 또는 프로그램에서 N 대한 네임스페이스 선언에는 이름 I 네임스페이스 또는 형식과 연결하는 global_using_alias_directive 포함됩니다. simple_name 모호하고 컴파일 시간 오류가 발생합니다.
      • 그렇지 않으면 N에서 명명된 I 네임스페이스를 simple_name이 참조합니다.
    • 그렇지 않은 경우, N이(가) 이름이 I이고 형식 매개변수가 K인 액세스 가능한 유형을 포함하고 있다면, 다음을 수행합니다.
      • K 0이고 simple_name 발생하는 위치가 N 대한 네임스페이스 선언으로 묶이고 네임스페이스 선언에 이름 I 네임스페이스 또는 형식과 연결하는 extern_alias_directive 또는 using_alias_directive 포함되는 경우, 또는 프로그램에서 N 대한 네임스페이스 선언에는 이름 I 네임스페이스와 연결하는 global_using_alias_directive 포함됩니다. 또는 형식을simple_name 모호하고 컴파일 시간 오류가 발생합니다.
      • 그렇지 않으면 namespace_or_type_name은 지정된 형식 인수로 생성된 형식을 참조합니다.
    • 그렇지 않으면 simple_name이 발생하는 위치가 N의 네임스페이스 선언에 의해 둘러싸인 경우:
      • K 0이고 네임스페이스 선언에 이름 I 가져온 네임스페이스 또는 형식과 연결하는 extern_alias_directive 또는 using_alias_directive 포함된 경우 또는 프로그램에서 N 대한 네임스페이스 선언에는 이름 I 가져온 네임스페이스 또는 형식과 연결하는 global_using_alias_directive 포함됩니다. simple_name 해당 네임스페이스 또는 형식을 참조합니다.
      • 그렇지 않은 경우 네임스페이스 선언 using_namespace_directiveusing_static_directiveusing_static_directive가져온 네임스페이스 및 형식 선언과 프로그램 대한 네임스페이스 선언의 global_using_namespace_directiveglobal_using_static_directive네임스페이스 선언에서 가져온 네임스페이스 및 형식 선언에 이름 및 이름이 있는 확장되지 않은 정적 멤버가 정확히 한 개 포함됩니다. 형식 매개 변수를 simple_name 지정된 형식 인수로 생성된 해당 형식 또는 멤버를 참조합니다.
      • 그렇지 않은 경우 네임스페이스 선언의 using_namespace_directive가져온 네임스페이스 및 형식과 프로그램N 대한 네임스페이스 선언의 global_using_namespace_directiveglobal_using_static_directive네임스페이스 선언에서 가져온 네임스페이스 및 형식 선언에 이름 IK 형식 매개 변수가 있는 둘 이상의 액세스 가능한 형식 또는 비 확장 메서드 정적 멤버가 포함된 경우 그러면 simple_name 모호하고 오류가 발생합니다.

확장 메서드 호출 §12.8.10.3

다음과 같이 최상의 type_nameC 찾기 위해 알고리즘을 변경합니다. 이것은 제안된 추가(굵은)가 있는 관련 글머리 기호입니다.

  • 가장 가까운 바깥쪽 네임스페이스 선언부터 시작하여, 각 바깥쪽 네임스페이스 선언을 차례로 거쳐, 포함된 컴파일 단위로 끝나면서, 확장 메서드의 후보 집합을 찾기 위한 시도가 이어집니다.
    • 지정된 네임스페이스 또는 컴파일 단위에 직접 포함된 제네릭이 아닌 형식 선언 Ci이 확장 메서드 Mj를 포함하는 경우, 그러한 확장 메서드의 집합이 후보 집합입니다.
    • 형식이 using_static_declarations 가져온 Ci 지정된 네임스페이스 또는 컴파일 단위 using_namespace_directive가져온 네임스페이스에서 직접 선언되고 컴파일 단위가 포함된 경우 global_using_static_declarations 가져오고 프로그램에서 global_using_namespace_directive가져온 네임스페이스에 직접 선언된 경우 Mj적합한 확장 메서드를 직접 포함할 있습니다. 그런 다음 해당 확장 메서드 집합이 후보 집합입니다.

컴파일 단위 §14.2

compilation_unit은 원본 파일의 전체 구조를 정의합니다. 컴파일 단위는 0개 이상의 global_using_directive뒤에 0개 이상의using_directive, 0개 이상의 global_attributes, 0개 이상의 namespace_member_declaration로 구성됩니다.

compilation_unit
    : extern_alias_directive* global_using_directive* using_directive* global_attributes? namespace_member_declaration*
    ;

C# 프로그램은 각각 별도의 소스 파일에 포함된 하나 이상의 컴파일 단위로 구성됩니다. C# 프로그램이 컴파일되면 모든 컴파일 단위가 함께 처리됩니다. 따라서 컴파일 단위는 순환적으로 서로 의존할 수 있습니다.

컴파일 단위의 global_using_directive는 프로그램의 모든 컴파일 단위에 있는 global_attributesnamespace_member_declaration에 영향을 미칩니다.

extern 별칭 §14.4

extern_alias_directive 범위는 자신의 컴파일 단위나 네임스페이스 본문에 즉시 포함된 global_using_directive,using_directive, global_attributesnamespace_member_declaration범위까지 포함해서 확장됩니다.

별칭 지시문 사용 §14.5.2

using_alias_directive기록되는 순서는 의미가 없으며, using_alias_directive 참조하는 namespace_or_type_name 확인은 즉시 포함된 컴파일 단위 또는 네임스페이스 본문의 using_alias_directive 자체 또는 다른 using_directive영향을 받지 않습니다. using_alias_directive 컴파일 단위에 즉시 포함된 경우 프로그램global_using_directive영향을 받지 않습니다. 즉, 즉시 포함된 컴파일 단위 또는 네임스페이스 본문에 using_directive없는 것처럼 using_alias_directivenamespace_or_type_name 확인되고, using_alias_directive 컴파일 단위에 즉시 포함되어 있으면 프로그램에 global_using_directive없습니다. 그러나 using_alias_directive 는 즉시 포함하는 컴파일 단위나 네임스페이스 본문의 extern_alias_directive에 의해 영향을 받을 수 있습니다.

글로벌 별칭 지시문 사용

global_using_alias_directive 프로그램 내에서 네임스페이스 또는 형식의 별칭 역할을 하는 식별자를 소개합니다.

global_using_alias_directive
    : 'global' 'using' identifier '=' namespace_or_type_name ';'
    ;

프로그램 내의 어느 컴파일 단위에서나 global_using_alias_directive를 포함하는 멤버 선언 내에서는, global_using_alias_directive에 의해 도입된 식별자를 사용하여 해당 네임스페이스나 형식을 참조할 수 있습니다.

global_using_alias_directive식별자global_using_alias_directive를 포함하는 프로그램의 컴파일 단위 선언 공간 안에서 고유해야 합니다.

일반 멤버와 마찬가지로 global_using_alias_directive도입된 이름은 중첩된 범위에서 비슷하게 명명된 멤버에 의해 숨겨집니다.

global_using_alias_directive작성되는 순서는 중요하지 않으며, global_using_alias_directive 에 의해 참조된 namespace_or_type_name 해결은 프로그램 내의 global_using_alias_directive 자체나 다른 global_using_directive또는 using_directive의 영향을 받지 않습니다. 즉, global_using_alias_directivenamespace_or_type_name 은 마치 즉시 포함된 컴파일 단위에 using_directive가 없고 포함된 전체 프로그램에 global_using_directive가 없는 것처럼 확인됩니다. 그러나 global_using_alias_directive는 즉시 포함된 컴파일 단위의 extern_alias_directive영향을 받을 수 있습니다.

global_using_alias_directive는 모든 네임스페이스나 형식에 대한 별칭을 만들 수 있습니다.

별칭을 통해 네임스페이스 또는 형식에 액세스하면 선언된 이름을 통해 해당 네임스페이스 또는 형식에 액세스하는 것과 정확히 동일한 결과가 생성됩니다.

별칭을 사용하면 닫힌 생성된 형식의 이름을 지정할 수 있지만 형식 인수를 제공하지 않고는 바인딩되지 않은 제네릭 형식 선언의 이름을 지정할 수 없습니다.

전역 네임스페이스 지시문 사용

global_using_namespace_directive는 네임스페이스에 포함된 형식을 프로그램으로 가져와 각 형식의 식별자를 제한 없이 사용할 수 있도록 합니다.

global_using_namespace_directive
    : 'global' 'using' namespace_name ';'
    ;

global_using_namespace_directive포함하는 프로그램의 멤버 선언 내에서 지정된 네임스페이스에 포함된 형식을 직접 참조할 수 있습니다.

global_using_namespace_directive는 지정된 네임스페이스에 포함된 형식을 가져오며, 특히 중첩된 네임스페이스는 가져오지 않습니다.

global_using_alias_directive와 달리, global_using_namespace_directive는 프로그램의 컴파일 단위 내에서 식별자가 이미 정의된 형식을 가져올 수 있습니다. 사실상, 지정된 컴파일 단위 내에서 프로그램의 모든 global_using_namespace_directive에 의해 가져온 이름은 컴파일 단위에서 비슷한 이름을 가진 멤버에 의해 가려집니다.

동일한 프로그램의 global_using_namespace_directive또는 global_using_static_directive에 의해 가져온 두 개 이상의 네임스페이스 또는 형식이 동일한 이름의 형식을 포함할 경우, type_name 로서의 해당 이름에 대한 참조는 모호한 것으로 간주됩니다.

또한 동일한 프로그램에서 global_using_namespace_directive또는 global_using_static_directive가져온 두 개 이상의 네임스페이스 또는 형식에 동일한 이름의 형식 또는 멤버가 포함된 경우 simple_name 해당 이름에 대한 참조는 모호한 것으로 간주됩니다.

global_using_namespace_directive에 의해 참조된 namespace_nameglobal_using_alias_directive에 의해 참조된 namespace_or_type_name과 동일한 방식으로 확인됩니다. 따라서 동일한 프로그램 내에서는 global_using_namespace_directive가 서로 영향을 주지 않으며, 순서에 관계없이 작성할 수 있습니다.

전역 사용 정적 지시문

global_using_static_directive는 형식 선언에서 직접 포함된 중첩 형식 및 정적 멤버를 프로그램 내로 가져와, 각 멤버와 형식의 식별자를 별도의 한정 없이 사용할 수 있도록 합니다.

global_using_static_directive
    : 'global' 'using' 'static' type_name ';'
    ;

global_using_static_directive을 포함하는 프로그램의 멤버 선언 내에서, 해당 형식의 선언에 직접 포함된 접근 가능한 중첩 형식 및 정적 멤버(확장 메서드 제외)를 직접 참조할 수 있습니다.

global_using_static_directive는 특히 확장 메서드를 정적 메서드로 직접 가져오지 않고, 대신 확장 메서드를 호출할 수 있도록 합니다.

global_using_static_directive는 기초 클래스에 선언된 멤버 및 형식이 아니라, 지정된 형식에 직접 선언된 멤버와 형식만 가져옵니다.

여러 global_using_namespace_directiveglobal_using_static_directives 간의 모호성은 global_using_namespace_directive(위)에 대한 섹션에서 설명합니다.

자격 있는 별칭 멤버 §14.8

다음과 같이 qualified_alias_member의 의미를 결정하는 알고리즘에 변경이 이루어졌습니다.

이것은 **굵게 표시된** 제안된 추가가 포함된 관련 글머리 기호입니다.

  • 그렇지 않으면, qualified_alias_member(있는 경우)을 즉시 포함하는 네임스페이스 선언(§14.3)에서 시작하여, 각 바깥쪽 네임스페이스 선언(있는 경우)을 계속하며, qualified_alias_member을 포함하는 컴파일 단위로 끝나기까지, 엔터티를 찾을 때까지 다음 단계가 평가됩니다.

    • 네임스페이스 선언 또는 컴파일 단위에 N 형식과 연결하는 using_alias_directive 포함된 경우, 또는 컴파일 단위에 도달할 때 프로그램에는 N 형식과 연결하는 global_using_alias_directive 포함되어qualified_alias_member 정의되지 않고 컴파일 시간 오류가 발생합니다.
    • 그렇지 않은 경우 네임스페이스 선언 또는 컴파일 단위에 네임스페이스와 N 연결하는 extern_alias_directive 또는 using_alias_directive 포함되어 있거나,컴파일 단위에 도달하면 프로그램에 N 네임스페이스와 연결하는 global_using_alias_directive 포함되어.
      • N에 연결된 네임스페이스에 I 네임스페이스가 포함되어 있고 K가 0이면, 자격_있는_별칭_멤버는 해당 네임스페이스를 참조합니다.
      • 그렇지 않으면, N와 연결된 네임스페이스에 I이라는 비제네릭 형식이 포함되어 있고 K가 0이면, qualified_alias_member는 해당 형식을 참조합니다.
      • 그 외에, N와 연결된 네임스페이스에 K 타입 매개 변수가 있는 I이라는 타입이 포함되어 있다면, qualified_alias_member는 지정된 타입 인수로 생성된 해당 타입을 참조합니다.
      • 그렇지 않으면 qualified_alias_member가 정의되지 않으며 컴파일 시 오류가 발생합니다.