다음을 통해 공유


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 같은 특성은 매개 변수를 참조해야 하지만 해당 매개 변수는 현재 범위에 없습니다.

상세 디자인

메서드

메서드의 type_parameters method_declaration범위 내에 있으며 return_type, method_bodytype_parameter_constraints_clauses 해당 범위 전체에서 형식을 형성하는 데 사용할 수 있지만 특성 식 내에서만 특성에는 없습니다.

메서드 매개 변수

메서드 선언은 매개 변수, 형식 매개 변수 및 지역 변수에 대한 별도의 선언 공간을 만듭니다. 이름은 형식 매개 변수 목록과 메서드의 정식 매개 변수 목록 및 메서드 블록의 지역 변수 선언에 의해 이 선언 공간에 도입됩니다. 이름은 메서드의 형식 매개 변수 목록과 정식 매개 변수 목록, 그리고 메서드 또는 그 매개 변수에 배치된 특성의 nameof 식에 의해 이 선언 공간에 도입됩니다.

[...]
메서드 블록 내에서 공식 매개 변수는 simple_name 식(단순 이름)의 식별자에서 참조할 수 있습니다. 메서드 또는 해당 매개 변수에 배치된 특성의 nameof 식 내에서는, 형식 매개변수를 simple_name 식의 식별자를 통해 참조할 수 있습니다.

익명 함수 시그니처

익명 함수의 매개변수 범위는 익명 함수 본문(§7.7)에 있는 속성의 nameof 표현식과 익명 함수 또는 그 매개 변수에 위치한 속성의 표현식입니다.

대리자 선언

nameof 식입니다.

단순 이름

simple_nameI 또는 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 표현식 입니다..