Attributes on local functions


Local function declarations are now permitted to have attributes. Parameters and type parameters on local functions are also allowed to have attributes.

Attributes with a specified meaning when applied to a method, its parameters, or its type parameters will have the same meaning when applied to a local function, its parameters, or its type parameters, respectively.

A local function can be made conditional in the same sense as a conditional method by decorating it with a [ConditionalAttribute]. A conditional local function must also be static. All restrictions on conditional methods also apply to conditional local functions, including that the return type must be void.


The extern modifier is now permitted on local functions. This makes the local function external in the same sense as an external method.

Similarly to an external method, the local-function-body of an external local function must be a semicolon. A semicolon local-function-body is only permitted on an external local function.

An external local function must also be static.


The local functions grammar is modified as follows:

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

    : (async | unsafe | static | extern)*

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