Compartir a través de


Ámbito nameof extendido

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 y 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 especificaciones.

Problema del campeón: https://github.com/dotnet/csharplang/issues/373

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

Atributos como NotNullWhen o CallerExpression necesitan referirse 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 de métodos

Una declaración de método crea un espacio de declaración separado para parámetros, parámetros de tipo y variables locales. 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 y mediante 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 de expresiones nameof en atributos colocados en el método o sus parámetros.

[...]
Dentro del bloque de un método, los parámetros formales pueden ser referenciados por sus identificadores en expresiones de nombres simples (Simple names). 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 especifique ningún type_argument_list, considere que K sea cero. El simple_name se evalúa y clasifica del siguiente modo:

  • 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 de un bloque adyacente) contiene una variable, parámetro o constante local con nombre I, entonces el simple_name se refiere a esa variable, parámetro o constante local 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 nombre I, entonces el simple_name se refiere a ese parámetro de tipo.
  • Si K es cero y el simple_name aparece dentro de una expresión nameof en un atributo sobre la declaración del método o sus parámetros y si dicha declaración incluye un parámetro o parámetro de tipo con nombre I, entonces el simple_name se refiere a dicho parámetro o parámetro de tipo..
  • En caso contrario, para cada tipo de instancia T (el tipo de instancia), empezando por el tipo de instancia de la declaración de tipo inmediatamente contigua y continuando con el tipo de instancia de cada declaración de clase o estructura contigua (si existe):
    [...]
  • De lo contrario, para cada espacio de nombres N, comenzando por el espacio de nombres en el que aparece el simple_name, continuando con cada espacio de nombres adyacente (si lo hay) y terminando con el espacio de nombres global, se evalúan los siguientes pasos hasta que se localiza una entidad:
    [...]
  • De lo contrario, el simple_name es indefinido y se produce un error 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 es [...] y nameof como 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.