Partilhar via


Â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

Métodos

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 .

Parâmetros do método

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.

Declarações de Delegados

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.

Nomes simples

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 nome I, 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 nome I, 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ão nameof 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 nome I, 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.

Escopos

  • 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.