Partager via


Modèles de propriétés étendus

Remarque

Cet article est une spécification de fonctionnalité. La spécification sert de document de conception pour la fonctionnalité. Il inclut les modifications de spécification proposées, ainsi que les informations nécessaires pendant la conception et le développement de la fonctionnalité. Ces articles sont publiés jusqu’à ce que les modifications de spécification proposées soient finalisées et incorporées dans la spécification ECMA actuelle.

Il peut y avoir des différences entre la spécification de la fonctionnalité et l’implémentation terminée. Ces différences sont consignées dans les notes pertinentes de la réunion de conception linguistique (LDM).

Vous pouvez en savoir plus sur le processus d’adoption des speclets de fonctionnalités dans la norme de langage C# dans l’article sur les spécifications .

Problème de champion : https://github.com/dotnet/csharplang/issues/4394

Résumé

Autoriser les sous-modèles de propriété à référencer des membres imbriqués, par exemple :

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

Au lieu de:

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

Motivation

Si vous souhaitez faire correspondre une propriété enfant, l’imbrication d’un autre modèle récursif ajoute trop de bruit, ce qui nuit à la lisibilité sans apporter de réel avantage.

Conception détaillée

La syntaxe property_pattern est modifiée comme suit :

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

Le récepteur de chaque recherche de nom est le type du membre T0 précédent, en commençant par le type d’entrée du property_pattern. si T est un type nullable, T0 est son type sous-jacent ; sinon, T0 est égal à T.

Par exemple, un modèle de la forme { Prop1.Prop2: pattern } équivaut exactement à { Prop1: { Prop2: pattern } }.

Notez que cela inclut la vérification null lorsque T est un type valeur nullable ou un type référence. Cette vérification de null signifie que les propriétés imbriquées disponibles seront les propriétés de T0, et non pas de T.

Les chemins de membre répétés sont autorisés. La compilation de la mise en correspondance des modèles peut tirer parti des parties communes des modèles.