Partilhar via


Padrões de propriedade estendidos

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 .

Questão campeã: 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 pretende corresponder a uma propriedade filha, aninhar outro padrão recursivo adiciona demasiado ruído, o que diminui a legibilidade sem qualquer vantagem real.

Design detalhado

A sintaxe property_pattern é modificada da seguinte forma:

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 recetor para cada pesquisa de nome é o tipo do membro anterior T0, começando pelo tipo de entrada do padrão de propriedade . se T for um tipo anulável, T0 é o seu tipo subjacente, caso contrário T0 é igual a T.

Por exemplo, um padrão da forma { Prop1.Prop2: pattern } é exatamente equivalente a { Prop1: { Prop2: pattern } }.

Observe que isso incluirá a verificação nula quando T for um tipo de valor nulo ou um tipo de referência. Esta verificação de valor nulo 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 de correspondência de padrões pode tirar proveito de partes comuns de padrões.