Compartilhar via


Padrões de propriedade estendidos

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 miniespecificações de recursos no padrão de linguagem C# no artigo sobre as especificações de .

Problema do especialista: https://github.com/dotnet/csharplang/issues/4394

Resumo

Permitir que subpadrões de propriedade façam referência a membros aninhados, por exemplo:

if (e is MethodCallExpression { Method.Name: "MethodName" })

Em vez de:

if (e is MethodCallExpression { Method: { Name: "MethodName" } })

Motivação

Quando você deseja corresponder a uma propriedade filha, aninhar outro padrão recursivo adiciona muito ruído, o que prejudicará a legibilidade sem nenhuma vantagem real.

Design detalhado

A sintaxe property_pattern é modificada da seguinte maneira:

property_pattern
  : type? property_pattern_clause simple_designation?
  ;

property_pattern_clause
  : '{' (subpattern (',' subpattern)* ','?)? '}'
  ;

subpattern
- : identifier ':' pattern
+ : subpattern_name ':' pattern
  ;

+subpattern_name
+ : identifier 
+ | subpattern_name '.' identifier
+ ;

O receptor para cada pesquisa de nome é o tipo do membro anterior T0, começando pelo tipo de entrada do property_pattern. se T for um tipo anulável, T0 é seu tipo subjacente; caso contrário, T0 é igual a T.

Por exemplo, um padrão do formulário { Prop1.Prop2: pattern } é exatamente equivalente a { Prop1: { Prop2: pattern } }.

Observe que isso incluirá a verificação nula quando T é um tipo de valor anulável ou um tipo de referência. Esta verificação nula significa que as propriedades aninhadas disponíveis serão as propriedades de T0, não de T.

Caminhos de membros repetidos são permitidos. A compilação da correspondência de padrões pode aproveitar partes comuns de padrões.