nameof
범위 확장
메모
이 문서는 기능 사양입니다. 사양은 기능의 디자인 문서 역할을 합니다. 여기에는 기능 디자인 및 개발 중에 필요한 정보와 함께 제안된 사양 변경 내용이 포함됩니다. 이러한 문서는 제안된 사양 변경이 완료되고 현재 ECMA 사양에 통합될 때까지 게시됩니다.
기능 사양과 완료된 구현 간에 약간의 불일치가 있을 수 있습니다. 이러한 차이는 관련된 언어 디자인 모임(LDM) 노트에서 기록됩니다.
사양문서에서 C# 언어 표준으로 기능 스펙렛을 채택하는 프로세스에 대해 자세히 알아볼 수 있습니다.
챔피언 이슈: https://github.com/dotnet/csharplang/issues/373
요약
메서드 또는 매개 변수의 특성 내에서 nameof(parameter)
허용합니다.
예를 들어:
[MyAttribute(nameof(parameter))] void M(int parameter) { }
[MyAttribute(nameof(TParameter))] void M<TParameter>() { }
void M(int parameter, [MyAttribute(nameof(parameter))] int other) { }
동기
NotNullWhen
또는 CallerExpression
같은 특성은 매개 변수를 참조해야 하지만 해당 매개 변수는 현재 범위에 없습니다.
상세 디자인
메서드의
메서드 선언은 매개 변수, 형식 매개 변수 및 지역 변수에 대한 별도의 선언 공간을 만듭니다. 이름은 형식 매개 변수 목록과 메서드의 정식 매개 변수 목록 및 메서드 블록의 지역 변수 선언에 의해 이 선언 공간에 도입됩니다.
이름은 메서드의 형식 매개 변수 목록과 정식 매개 변수 목록, 그리고 메서드 또는 그 매개 변수에 배치된 특성의 nameof
식에 의해 이 선언 공간에 도입됩니다.
[...]
메서드 블록 내에서 공식 매개 변수는 simple_name 식(단순 이름)의 식별자에서 참조할 수 있습니다.
메서드 또는 해당 매개 변수에 배치된 특성의 nameof
식 내에서는, 형식 매개변수를 simple_name 식의 식별자를 통해 참조할 수 있습니다.
익명 함수의 매개변수 범위는 익명 함수 본문(§7.7)에 있는 속성의 및 nameof
표현식과 익명 함수 또는 그 매개 변수에 위치한 속성의 표현식입니다.
nameof
식입니다.
simple_name은 I
또는 I<A1,...,Ak>
방식 중 하나로, I
는 단일 식별자이고, <A1,...,Ak>
는 선택적인 type_argument_list입니다.
type_argument_list 지정되지 않은 경우 K
0으로 간주합니다.
simple_name 다음과 같이 평가되고 분류됩니다.
-
K
가 0인 경우, simple_name이(가) 블록 내에 나타나고, 그 블록이나 둘러싸고 있는 블록의 지역 변수 선언 공간(선언)에 이름I
이(가) 있는 지역 변수, 매개변수 또는 상수가 포함되어 있다면, simple_name은(는) 해당 지역 변수, 매개변수 또는 상수를 참조하며, 이는 변수 또는 값으로 분류됩니다. -
K
0이고 simple_name 제네릭 메서드 선언의 본문 내에 표시되고 해당 선언에 이름I
형식 매개 변수가 포함되어 있으면 simple_name 해당 형식 매개 변수를 참조합니다. -
K
이 0이고, simple_name이 메서드 선언이나 그 매개변수의 속성 내nameof
식에서 나타나며, 그 선언에 이름이I
인 매개변수 또는 형식 매개변수가 포함되어 있다면, simple_name은 그 매개변수 또는 형식 매개변수를 참조합니다. - 그렇지 않으면 각 인스턴스 형식
T
(인스턴스 형식)에 대해 즉시 바깥쪽 형식 선언의 인스턴스 형식으로 시작하고 각 바깥쪽 클래스 또는 구조체 선언의 인스턴스 형식(있는 경우)을 계속합니다.
[...] - 그렇지 않으면, 네임스페이스
N
각각에 대해, simple_name가 발생하는 네임스페이스부터 시작하여, 다음으로 각 외부 네임스페이스(있는 경우)를 거쳐, 최종적으로 전역 네임스페이스에 이르기까지, 엔터티가 위치할 때까지 다음 단계가 평가됩니다.
[...] - 그렇지 않으면 simple_name 정의되지 않고 컴파일 시간 오류가 발생합니다.
- 메서드 선언에 있는 type_parameter_list에 의해 선언된 형식 매개 변수의 범위는 메서드 선언 또는 해당 매개 변수의 특성 내에서 및
nameof
표현식에 해당합니다. - 메서드 선언의 매개변수의 범위는 해당 method_declaration의 method_body와 메서드 선언 또는 그 매개변수의 특성에 있는
nameof
표현식 입니다..
관련 사양 섹션
C# feature specifications