Escopo nameof
estendido
Nota
Este artigo é uma especificação de recurso. A especificação serve como o documento de design para o recurso. Ele inclui alterações de especificação propostas, juntamente com as informações necessárias durante o design e o desenvolvimento do recurso. Esses artigos são publicados até que as alterações de especificação propostas sejam finalizadas e incorporadas na especificação ECMA atual.
Pode haver algumas discrepâncias entre a especificação do recurso e a implementação concluída. Essas diferenças são capturadas nas notas pertinentes da reunião de design de idioma (LDM).
Você pode saber mais sobre o processo de adoção de speclets de recursos no padrão de linguagem C# no artigo sobre as especificações de .
Resumo
Permitir nameof(parameter)
dentro de um atributo em um método ou parâmetro.
Por exemplo:
[MyAttribute(nameof(parameter))] void M(int parameter) { }
[MyAttribute(nameof(TParameter))] void M<TParameter>() { }
void M(int parameter, [MyAttribute(nameof(parameter))] int other) { }
Motivação
Atributos como NotNullWhen
ou CallerExpression
precisam se referir a parâmetros, mas esses parâmetros atualmente não estão no escopo.
Design detalhado
Os type_parameters do método estão no escopo em todo o method_declaration e podem ser usados para formar tipos em todo esse escopo em return_type, method_bodye type_parameter_constraints_clauses mas não em atributos, exceto em uma expressão em nameof
em atributos.
Uma declaração de método cria um espaço de declaração separado para parâmetros, parâmetros de tipo e variáveis locais. Os nomes são introduzidos nesse espaço de declaração pela lista de parâmetros de tipo e pela lista de parâmetros formais do método e por declarações de variáveis locais no bloco do método.
Os nomes são introduzidos nesse espaço de declaração pela lista de parâmetros de tipo e pela lista de parâmetros formais do método em expressões nameof
em atributos colocados no método ou em seus parâmetros.
[...]
Dentro do bloco de um método, os parâmetros formais podem ser referenciados por seus identificadores em expressões simple_name (nomes simples).
Dentro de uma expressão nameof
em atributos colocados no método ou em seus parâmetros, os parâmetros formais podem ser referenciados por seus identificadores em expressões simple_name.
Assinaturas de função anônimas
O escopo dos parâmetros da função anônima é o anonymous_function_body (§7.7); e nameof
referem-se a expressões em atributos associados à função anônima ou aos seus parâmetros.
O escopo dos parâmetros do delegado é nameof
expressões em atributos colocados na declaração, seus parâmetros de tipo ou seus parâmetros.
Um simple_name é uma das formas I
ou I<A1,...,Ak>
, em que I
é um único identificador e <A1,...,Ak>
é um type_argument_list opcional. Quando nenhum type_argument_list for especificado, considere K
como zero. O simple_name é avaliado e classificado da seguinte maneira:
- Se
K
for zero e o simple_name aparecer dentro de um bloco e se o espaço de declaração de variável local (Declarações) do bloco (ou um bloco delimitante) contiver uma variável local, parâmetro ou constante com o nomeI
, o simple_name se referirá a essa variável local, parâmetro ou constante e será classificado como uma variável ou valor. - Se
K
for zero e o simple_name aparecer dentro do corpo de uma declaração de método genérico e se essa declaração incluir um parâmetro de tipo com o nomeI
, o simple_name se referirá a esse parâmetro de tipo. - Se
K
for zero e o simple_name aparecer em uma expressãonameof
em um atributo na declaração do método ou em seus parâmetros e se essa declaração incluir um parâmetro ou parâmetro de tipo com o nomeI
, o simple_name se referirá a esse parâmetro ou parâmetro de tipo. - Caso contrário, para cada tipo de instância
T
(o tipo de instância), começando com o tipo de instância da declaração de tipo imediatamente adjacente e continuando com o tipo de instância de cada declaração de classe ou struct envolvente (se houver):
[...] - Caso contrário, para cada namespace
N
, começando com o namespace no qual o simple_name ocorre, continuando com cada namespace envolvente (se houver) e terminando com o namespace global, as seguintes etapas são avaliadas até uma entidade ser localizada:
[...] - Caso contrário, o simple_name será indefinido e ocorrerá um erro de tempo de compilação.
- O escopo de um parâmetro de tipo declarado por um type_parameter_list em um method_declaration é [...] expressões e
nameof
em um atributo na declaração do método ou em seus parâmetros. - O escopo de um parâmetro declarado em um method_declaration (Métodos) é o method_body dessa expressão method_declaration e
nameof
em um atributo na declaração do método ou em seus parâmetros.
Seções de especificação relacionadas
C# feature specifications