Vzory rozšířených vlastností
Poznámka
Tento článek je specifikace funkce. Specifikace slouží jako návrhový dokument pro funkci. Zahrnuje navrhované změny specifikace spolu s informacemi potřebnými při návrhu a vývoji funkce. Tyto články se publikují, dokud nebudou navrhované změny specifikace finalizovány a začleněny do aktuální specifikace ECMA.
Mezi specifikací funkce a dokončenou implementací může docházet k nějakým nesrovnalostem. Tyto rozdíly jsou zachyceny v poznámkách ze schůzky návrhu jazyka (LDM) .
Další informace o procesu přijetí specifikací funkcí do jazyka C# najdete v článku o specifikacích .
Problém šampiona: https://github.com/dotnet/csharplang/issues/4394
Shrnutí
Umožněte podvzorům vlastností odkazovat na vnořené členy, například:
if (e is MethodCallExpression { Method.Name: "MethodName" })
Namísto:
if (e is MethodCallExpression { Method: { Name: "MethodName" } })
Motivace
Pokud chcete shodovat podřízenou vlastnost, vnoření jiného rekurzivního vzoru přidá příliš mnoho šumu, což poškodí čitelnost bez skutečné výhody.
Podrobný návrh
Syntaxe property_pattern se upraví následujícím způsobem:
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
+ ;
Příjemce pro každé vyhledávání jmen je typ předchozího členu T0, počínaje vstupní typproperty_pattern. pokud T je typ s možnou hodnotou null, T0 je jeho základní typ, jinak T0 se rovná T.
Například vzor formuláře { Prop1.Prop2: pattern }
je přesně ekvivalentní { Prop1: { Prop2: pattern } }
.
Všimněte si, že to bude obsahovat kontrolu null, pokud T je typ hodnoty null nebo typ odkazu. Tato kontrola na hodnotu null znamená, že vnořené vlastnosti, které jsou k dispozici, budou vlastnostmi T0, nikoli T.
Jsou povoleny opakované cesty členů. Kompilace porovnávání vzorů může využívat společné části vzorů.
C# feature specifications