Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Расширенная область
Заметка
Эта статья является спецификацией компонентов. Спецификация служит проектным документом для функции. Оно включает предлагаемые изменения спецификации, а также информацию, необходимую во время проектирования и разработки функции. Эти статьи публикуются до тех пор, пока предложенные изменения спецификации не будут завершены и включены в текущую спецификацию 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_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