Âmbito alargado do nameof
Observação
Este artigo é uma especificação de recurso. A especificação serve como o documento de design para o recurso. Ele inclui mudanças de especificação propostas, juntamente com as informações necessárias durante o design e desenvolvimento do recurso. Estes artigos são publicados até que as alterações de especificações 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 Language Design Meeting (LDM).
Você pode saber mais sobre o processo de adoção de especificações de recursos no padrão de linguagem C# no artigo sobre as especificações .
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 não estão atualmente no escopo.
Projeto detalhado
Os type_parameters do método estão no escopo em todo o method_declaratione 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 dentro de uma expressão 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 neste espaço de declaração pela lista de parâmetros de tipo e pela lista de parâmetros formal do método e por declarações de variáveis locais no bloco do método.
Os nomes são introduzidos neste espaço de declaração pela lista de parâmetros de tipo e pela lista de parâmetros formal 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, 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 seus parâmetros, parâmetros formais podem ser referenciados por seus identificadores em expressões simple_name.
Assinaturas de função anónimas
O âmbito dos parâmetros da função anónima é o corpo_da_função_anónima (§7.7) e as expressões e nameof
em atributos colocados na função anónima ou nos 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 é da forma I
ou do formulário I<A1,...,Ak>
, onde I
é um identificador único e <A1,...,Ak>
é um type_argument_listopcional . Quando nenhum type_argument_list for especificado, assuma que K
é zero. O simple_name é avaliado e classificado da seguinte forma:
- Se
K
for zero e o simple_name aparecer dentro de um bloco e se o espaço de declaração da variável local do bloco (ou de um bloco anexo) (Declarações) contiver uma variável, parâmetro ou constante local com nomeI
, então o simple_name refere-se a essa variável, parâmetro ou constante local e é classificado como uma variável ou valor. - Se
K
for zero e o simple_name aparecer no corpo de uma declaração de método genérica e se essa declaração incluir um parâmetro type com nomeI
, então o simple_name se refere a esse parâmetro type. -
Se
K
for zero e o simple_name aparecer dentro de uma expressãonameof
em um atributo na declaração de método ou seus parâmetros e se essa declaração incluir um parâmetro ou parâmetro de tipo com nomeI
, então o simple_name se refere 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 envolvente e continuando com o tipo de instância de cada classe ou estrutura 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 de inclusão (se houver) e terminando com o namespace global, as etapas a seguir são avaliadas até que uma entidade seja localizada:
[...] - Caso contrário, o simple_name é indefinido e ocorre um erro em tempo de compilação.
- O escopo de um parâmetro de tipo declarado por um type_parameter_list em um method_declaration é [...] e
nameof
expressões em um atributo na declaração do método, ou nos seus parâmetros. - O escopo de um parâmetro declarado em um method_declaration (Métodos) é a method_body desse method_declaration e
nameof
expressões em um atributo na declaração de método ou seus parâmetros.
Seções de especificações relacionadas
C# feature specifications