전역 사용 지시문
메모
이 문서는 기능 사양입니다. 사양은 기능의 디자인 문서 역할을 합니다. 여기에는 기능 디자인 및 개발 중에 필요한 정보와 함께 제안된 사양 변경 내용이 포함됩니다. 이러한 문서는 제안된 사양 변경이 완료되고 현재 ECMA 사양에 통합될 때까지 게시됩니다.
기능 사양과 완료된 구현 간에 약간의 불일치가 있을 수 있습니다. 이러한 차이는관련
사양문서에서 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_attributes 및 namespace_member_declaration들의 범위로 확장됩니다. extern_alias_directive 기본 선언 공간에 새 멤버를 추가하지 않습니다. 즉, extern_alias_directive 전이적이 아니라 컴파일 단위 또는 발생하는 네임스페이스 본문에만 영향을 줍니다.
- global_using_directive에 의해 정의되거나 가져온 이름의 범위는 프로그램의 모든 compilation_unit에 있는 global_attributes와 namespace_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이고I
N
네임스페이스의 이름인 경우 다음을 수행합니다.-
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는
N
의I
라는 네임스페이스를 참조합니다.
-
namespace_or_type_name 발생하는 위치가
- 그렇지 않은 경우,
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_directive및 using_alias_directive를 통해 가져온 네임스페이스 및 형식 선언과, 프로그램에서
N
에 대한 네임스페이스 선언의 global_using_namespace_directive및 global_using_static_directive를 통해 가져온 네임스페이스 및 형식 선언에 이름I
과K
형식 매개변수가 있는 접근 가능한 형식이 정확히 하나 포함되어 있다면, 그러면 namespace_or_type_name는 지정된 형식 인수를 사용하여 생성된 해당 형식을 참조합니다. - 그렇지 않으면 네임스페이스 선언 using_namespace_directive및 using_alias_directive통해 가져온 네임스페이스 및 형식 선언과 프로그램
N
대한 네임스페이스 선언의 global_using_namespace_directive및 global_using_static_directiveglobal_using_static_directive네임스페이스 선언에서 가져온 네임스페이스 및 형식 선언에 이름I
및K
형식 매개 변수가 있는 액세스 가능한 형식이 둘 이상 포함되어 있는 경우 그러면 namespace_or_type_name 모호하고 오류가 발생합니다.
-
-
- 그렇지 않으면 namespace_or_type_name 정의되지 않고 컴파일 시간 오류가 발생합니다.
-
간단한 이름 §12.8.4
다음과 같이 simple_name 평가 규칙이 변경됩니다.
이것은 제안된 추가(굵은
- 그렇지 않으면 각 네임스페이스
N
에 대해, 단순_이름이 발생하는 네임스페이스부터 시작하여, 각 바깥쪽 네임스페이스(있는 경우라면)를 거쳐 전역 네임스페이스에 이르기까지, 엔터티가 위치할 때까지 다음 단계가 차례로 평가됩니다.-
K
0이고I
N
네임스페이스의 이름인 경우 다음을 수행합니다.-
simple_name 발생하는 위치가
N
대한 네임스페이스 선언으로 묶이고 네임스페이스 선언에 이름I
네임스페이스 또는 형식과 연결하는 extern_alias_directive 또는 using_alias_directive 포함된 경우, 또는 프로그램에서N
대한 네임스페이스 선언에는 이름I
네임스페이스 또는 형식과 연결하는 global_using_alias_directive 포함됩니다. simple_name 모호하고 컴파일 시간 오류가 발생합니다. - 그렇지 않으면
N
에서 명명된I
네임스페이스를 simple_name이 참조합니다.
-
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_directive 및using_static_directive using_static_directive 가져온 네임스페이스 및 형식 선언과 프로그램대한 네임스페이스 선언의 global_using_namespace_directive 및global_using_static_directive 네임스페이스 선언에서 가져온 네임스페이스 및 형식 선언에 이름및 이름이 있는 확장되지 않은 정적 멤버가 정확히 한 개 포함됩니다. 형식 매개 변수를 simple_name 지정된 형식 인수로 생성된 해당 형식 또는 멤버를 참조합니다. - 그렇지 않은 경우 네임스페이스 선언의 using_namespace_directive가져온 네임스페이스 및 형식과 프로그램
N
대한 네임스페이스 선언의 global_using_namespace_directive및 global_using_static_directive네임스페이스 선언에서 가져온 네임스페이스 및 형식 선언에 이름I
및K
형식 매개 변수가 있는 둘 이상의 액세스 가능한 형식 또는 비 확장 메서드 정적 멤버가 포함된 경우 그러면 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_attributes 및 namespace_member_declaration에 영향을 미칩니다.
extern 별칭 §14.4
extern_alias_directive 범위는 자신의 컴파일 단위나 네임스페이스 본문에 즉시 포함된 global_using_directive,using_directive, global_attributes 및 namespace_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_directive 의 namespace_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_name은 global_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_directive및 global_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가 정의되지 않으며 컴파일 시 오류가 발생합니다.
-
- 네임스페이스 선언 또는 컴파일 단위에
C# feature specifications