Á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
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 .
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.
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.
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.
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 nombreI
, 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 nombreI
, el simple_name hace referencia a ese parámetro de tipo. - Si
K
es cero y el simple_name aparece dentro de una expresiónnameof
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 nombreI
, 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.
- 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.
Secciones de especificación relacionadas
C# feature specifications