Modelli di proprietà estesi
Nota
Questo articolo è una specifica di funzionalità. La specifica funge da documento di progettazione per la funzionalità. Include le modifiche specifiche proposte, insieme alle informazioni necessarie durante la progettazione e lo sviluppo della funzionalità. Questi articoli vengono pubblicati fino a quando le modifiche specifiche proposte non vengono completate e incorporate nella specifica ECMA corrente.
Potrebbero verificarsi alcune discrepanze tra la specifica di funzionalità e l'implementazione completata. Tali differenze vengono acquisite nelle pertinenti note del language design meeting (LDM) .
Puoi ottenere maggiori informazioni sul processo di adozione degli speclet delle funzionalità nello standard del linguaggio C# nell'articolo relativo alle specifiche .
Problema del campione: https://github.com/dotnet/csharplang/issues/4394
Sommario
Consenti ai sottopattern delle proprietà di fare riferimento ai membri annidati, ad esempio:
if (e is MethodCallExpression { Method.Name: "MethodName" })
Invece di:
if (e is MethodCallExpression { Method: { Name: "MethodName" } })
Motivazione
Quando si desidera trovare una corrispondenza con una proprietà del figlio, annidare un altro modello ricorsivo aggiunge troppo rumore, compromettendo la leggibilità senza apportare alcun vantaggio concreto.
Progettazione dettagliata
La sintassi property_pattern viene modificata nel modo seguente:
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
+ ;
Il ricevitore per ogni ricerca del nome è il tipo del membro precedente T0, a partire dal tipo di input del property_pattern. se T è un tipo nullable, T0 è il tipo sottostante; in caso contrario, T0 è uguale a T.
Ad esempio, un modello del form { Prop1.Prop2: pattern }
equivale esattamente a { Prop1: { Prop2: pattern } }
.
Si noti che questo includerà il controllo di valore nullo quando T è un tipo di valore nullable o un tipo di riferimento. Questo controllo Null indica che le proprietà annidate disponibili saranno le proprietà di T0, non di T.
Sono consentiti percorsi membro ripetuti. La compilazione della corrispondenza dei modelli può sfruttare le parti comuni dei modelli.
C# feature specifications