Поделиться через


Расширенная область 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 выражений в атрибуте в объявлении метода или его параметрах.
  • декларации