Compartilhar via


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

Métodos

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.

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

declarações de representante

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 é 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 nome I, 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 nome I, o simple_name se referirá a esse parâmetro de tipo.
  • Se K for zero e o simple_name aparecer em uma expressão nameof 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 nome I, 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.

Escopos

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