Compartir a través de


Ámbito nameof ampliado

Nota

Este artículo es una especificación de características. La especificación actúa como documento de diseño de la característica. Incluye cambios de especificación propuestos, junto con la información necesaria durante el diseño y el desarrollo de la característica. Estos artículos se publican hasta que se finalizan los cambios de especificación propuestos e se incorporan en la especificación ECMA actual.

Puede haber algunas discrepancias entre la especificación de características y la implementación completada. Esas diferencias se recogen en las notas de la reunión de diseño de lenguaje (LDM) correspondientes.

Puede obtener más información sobre el proceso de adopción de especificaciones de características en el estándar del lenguaje C# en el artículo sobre las especificaciones de .

Resumen

Permitir nameof(parameter) dentro de un atributo en un método o parámetro. Por ejemplo:

  • [MyAttribute(nameof(parameter))] void M(int parameter) { }
  • [MyAttribute(nameof(TParameter))] void M<TParameter>() { }
  • void M(int parameter, [MyAttribute(nameof(parameter))] int other) { }

Motivación

Los atributos como NotNullWhen o CallerExpression deben hacer referencia a parámetros, pero esos parámetros no están actualmente en el ámbito.

Diseño detallado

Métodos

Los type_parameters del método se encuentran en el ámbito en toda la method_declaration y se pueden usar para formar tipos a lo largo de ese ámbito en return_type, method_body y type_parameter_constraints_clauses pero no en atributos , excepto dentro de una expresión nameof en atributos .

parámetros del método

Una declaración de método crea un espacio de declaración independiente para parámetros, parámetros de tipo y variables locales. Los nombres se introducen en este espacio de declaración por la lista de parámetros de tipo y la lista de parámetros formales del método y por declaraciones de variables locales en el bloque del método. Los nombres se introducen en este espacio de declaración mediante la lista de parámetros de tipo y la lista de parámetros formales del método en las expresiones de nameof en los atributos colocados en el método o sus parámetros.

[...]
Dentro del bloque de un método, se puede hacer referencia a los parámetros formales por sus identificadores en expresiones de simple_name (nombres simples). Dentro de una expresión nameof en atributos colocados en el método o sus parámetros, sus identificadores pueden hacer referencia a los parámetros formales en expresiones simple_name.

Firmas de función anónima

El ámbito de los parámetros de la función anónima son las expresiones anonymous_function_body (§7.7) y nameof en los atributos colocados sobre la función anónima o sus parámetros.

Declaraciones de delegados

El ámbito de los parámetros del delegado son expresiones nameof en atributos colocados en la declaración, sus parámetros de tipo o sus parámetros.

nombres simples

Un simple_name es de la forma I o de la forma I<A1,...,Ak>, donde I es un identificador simple y <A1,...,Ak> es una type_argument_list opcional. Cuando no se especifica ningún type_argument_list, se debe considerar K como cero. El simple_name se evalúa y clasifica de la siguiente manera:

  • Si K es cero y el simple_name aparece dentro de un bloque y si el espacio de declaración de variables locales (declaraciones) del bloque (o un bloque envolvente) contiene una variable local, un parámetro o una constante con el nombre I, el simple_name hace referencia a esa variable local, parámetro o constante y se clasifica como variable o valor.
  • Si K es cero y el simple_name aparece dentro del cuerpo de una declaración de método genérico y si esa declaración incluye un parámetro de tipo con el nombre I, el simple_name hace referencia a ese parámetro de tipo.
  • Si K es cero y el simple_name aparece dentro de una expresión nameof en un atributo en la declaración del método o sus parámetros y si esa declaración incluye un parámetro o parámetro de tipo con el nombre I, el simple_name hace referencia a ese parámetro o parámetro de tipo.
  • De lo contrario, para cada tipo de instancia T (el tipo de instancia), empezando por el tipo de instancia de la declaración de tipo inmediatamente envolvente y continuando con el tipo de instancia de cada declaración de clase o estructura envolvente (si existe):
    [...]
  • De lo contrario, para cada espacio de nombres N, empezando por el espacio de nombres en el que se produce el simple_name, continuando con cada espacio de nombres envolvente (si existe) y finalizando con el espacio de nombres global, se evalúan los pasos siguientes hasta que se encuentra una entidad:
    [...]
  • De lo contrario, el simple_name no está definido y se produce un error en tiempo de compilación.

Ámbitos

  • El ámbito de un parámetro de tipo declarado por una lista de parámetros de tipo en una declaración de método abarca [...] y nameof expresiones en un atributo en la declaración del método o sus parámetros.
  • El ámbito de un parámetro declarado en una method_declaration (Métodos) es el method_body de esa method_declaration y expresiones nameof de un atributo en la declaración del método o en sus parámetros.