Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Escopo
Observação
Este artigo é uma especificação de recurso. A especificação serve como o documento de design para o recurso. Ela 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 divergê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 .
Problema do especialista: https://github.com/dotnet/csharplang/issues/373
Resumo
Permita 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.
Projeto 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.
simple_name é avaliado e classificado da seguinte maneira:
- Se
Kfor 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
Kfor 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
Kfor zero e o simple_name aparecer em uma expressãonameofem 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, simple_name será indefinido e ocorrerá um erro de tempo de compilação.
- O escopo de um parâmetro de tipo declarado por uma type_parameter_list em uma method_declaration é [...] expressões e
nameofem 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
nameofem um atributo na declaração do método ou em seus parâmetros.
Seções de especificação relacionadas
C# feature specifications