Dela via


Utökade egenskapsmönster

Anteckning

Den här artikeln är en funktionsspecifikation. Specifikationen fungerar som designdokument för funktionen. Den innehåller föreslagna specifikationsändringar, tillsammans med information som behövs under utformningen och utvecklingen av funktionen. Dessa artiklar publiceras tills de föreslagna specifikationsändringarna har slutförts och införlivats i den aktuella ECMA-specifikationen.

Det kan finnas vissa skillnader mellan funktionsspecifikationen och den slutförda implementeringen. Dessa skillnader samlas in i de relevanta LDM-anteckningar (Language Design Meeting).

Du kan läsa mer om processen för att införa funktionsspecifikationer i C#-språkstandarden i artikeln om specifikationerna.

Champion-fråga: https://github.com/dotnet/csharplang/issues/4394

Sammanfattning

Tillåt att egenskapsundermönster refererar till kapslade medlemmar, till exempel:

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

Istället för:

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

Motivation

När du vill matcha en egenskap hos ett barn, lägger inbakning av ett annat rekursivt mönster till för mycket brus, vilket skadar läsbarheten utan någon egentlig fördel.

Detaljerad design

Syntaxen för property_pattern ändras enligt följande:

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
+ ;

Mottagaren för varje namnsökning är typen av föregående medlem T0, med början från indatatypen för egenskapsmönstret . Om T- är en null-typ är T0 dess underliggande typ, annars är T0 lika med T.

Till exempel motsvarar ett mönster i formuläret { Prop1.Prop2: pattern } exakt { Prop1: { Prop2: pattern } }.

Observera att detta inkluderar null-kontrollen när T- är en nullbar värdetyp eller en referenstyp. Den här null-kontrollen innebär att de kapslade egenskaper som är tillgängliga är egenskaperna för T0, inte för T.

Upprepade medlemsvägar tillåts. Kompilering av mönstermatchning kan dra nytta av vanliga delar av mönster.