Расширенная область nameof
Заметка
Эта статья является спецификацией компонентов. Спецификация служит проектным документом для функции. Оно включает предлагаемые изменения спецификации, а также информацию, необходимую во время проектирования и разработки функции. Эти статьи публикуются до тех пор, пока предложенные изменения спецификации не будут завершены и включены в текущую спецификацию ECMA.
Может возникнуть некоторое несоответствие между спецификацией компонентов и завершенной реализацией. Эти различия фиксируются в соответствующих собраниях по проектированию языка (LDM).
Дополнительные сведения о процессе внедрения спецификаций функций в стандарт языка C# см. в статье о спецификациях .
Сводка
Разрешить использование 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_bodyи type_parameter_constraints_clauses, но не в атрибутах, за исключением выражения nameof
атрибутов атрибутов.
Объявление метода создает отдельное пространство объявления для параметров, параметров типа и локальных переменных. Имена вводятся в это пространство объявления через список параметров типа, формальный список параметров метода и локальные объявления переменных в блоке метода.
Имена вводятся в это пространство объявлений по списку параметров типа и формальному списку параметров метода в выражениях nameof
атрибутов, размещенных в методе или его параметрах.
[...]
В блоке метода формальные параметры можно использовать по их идентификаторам в выражениях простого имени (simple_name).
В выражении nameof
в атрибутах, которые размещены на методе или его параметрах, на формальные параметры можно ссылаться по их идентификаторам в выражениях simple_name.
Область параметров анонимной функции — это anonymous_function_body (§7.7) и выражения nameof
в атрибутах, размещённых в анонимной функции или её параметрах.
Область параметров делегата определяется nameof
выражениями в атрибутах, которые размещены на объявлении, его параметрах типа или его параметрах.
simple_name либо имеет форму I
, либо форму I<A1,...,Ak>
, где I
— один идентификатор, а <A1,...,Ak>
является необязательным type_argument_list. Если type_argument_list не указано, следует считать K
равным нулю.
simple_name вычисляется и классифицируется следующим образом:
- Если
K
равно нулю, simple_name отображается в блоке, а если локальное пространство объявления переменной (или заключенного блока) содержит локальную переменную, параметр или константу с именемI
, то simple_name относится к этой локальной переменной, параметру или константе и классифицируется как переменная или значение. - Если
K
равно нулю, simple_name отображается в тексте объявления универсального метода и если это объявление включает параметр типа с именемI
, то simple_name ссылается на этот параметр типа. -
Если
K
равно нулю, и simple_name встречается вnameof
выражении в атрибуте объявления метода или его параметров, и если в этом объявлении есть параметр или параметр типа с именемI
, то simple_name будет ссылаться на этот параметр или параметр типа. - В противном случае, для каждого типа экземпляра
T
(тип экземпляра), начиная с типа экземпляра, который сразу же окружает объявление типа, и продолжая с типами экземпляров каждого окружающего класса или структуры (если таковые имеются):
[...] - В противном случае для каждого пространства имен
N
, начиная с пространства имен, в котором находится simple_name, продолжая с каждым включающим пространством имен (если оно существует) и заканчивая глобальным пространством имен, следующие действия оцениваются до тех пор, пока сущность не будет найдена:
[...] - В противном случае simple_name не определен и возникает ошибка во время компиляции.
- Область видимости параметра типа, объявленного в списке параметров типа в объявлении метода, включает выражения и
nameof
в атрибуте, относящемся к объявлению метода или его параметрам. - Область параметра, объявленного в method_declaration (методы), является method_body этого method_declaration и
nameof
выражений в атрибуте в объявлении метода или его параметрах.
Связанные разделы спецификаций
C# feature specifications