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


Атрибуты для локальных функций

Заметка

Эта статья является спецификацией компонентов. Спецификация служит проектным документом для функции. Она включает предлагаемые изменения спецификации, а также информацию, необходимую во время проектирования и разработки функции. Эти статьи публикуются до тех пор, пока предложенные изменения спецификации не будут завершены и включены в текущую спецификацию ECMA.

Может возникнуть некоторое несоответствие между спецификацией компонентов и завершенной реализацией. Эти различия фиксируются в соответствующих записи собрания по проектированию языка (LDM).

Дополнительные сведения о процессе внедрения спецификаций функций в стандарт языка C# см. в статье о спецификациях .

Проблема чемпиона: https://github.com/dotnet/csharplang/issues/1888

Атрибуты

Теперь объявления локальных функций разрешены иметь атрибуты (§22). Параметры и параметры типа для локальных функций также могут иметь атрибуты.

Атрибуты с заданным значением при применении к методу, его параметрам или параметрам типа будут иметь то же самое значение при применении к локальной функции, его параметрам или параметрам типа соответственно.

Локальная функция может быть сделана условной в том же смысле, что и условный метод (§22.5.3), с помощью декоратора [ConditionalAttribute]. Условная локальная функция также должна быть static. Все ограничения на условные методы также применяются к условным локальным функциям, включая то, что возвращаемый тип должен быть void.

Стажёр

Модификатор extern теперь разрешен для локальных функций. Это делает локальную функцию внешней в том же смысле, что и внешний метод (§15.6.8).

Аналогично внешнему методу, локальное тело-функции внешней локальной функции должно быть точкой с запятой. Точка с запятой локально-функции-body разрешена только во внешней локальной функции.

Внешняя локальная функция также должна быть static.

Синтаксис

§13.6.4или грамматика локальных функций изменяются следующим образом:

local-function-header
    : attributes? local-function-modifiers? return-type identifier type-parameter-list?
        ( formal-parameter-list? ) type-parameter-constraints-clauses
    ;

local-function-modifiers
    : (async | unsafe | static | extern)*
    ;

local-function-body
    : block
    | arrow-expression-body
    | ';'
    ;