手記
この記事は機能仕様です。 仕様は、機能の設計ドキュメントとして機能します。 これには、提案された仕様の変更と、機能の設計と開発時に必要な情報が含まれます。 これらの記事は、提案された仕様の変更が最終決定され、現在の ECMA 仕様に組み込まれるまで公開されます。
機能の仕様と完成した実装の間には、いくつかの違いがある可能性があります。 これらの違いは、関連する 言語設計会議 (LDM) ノートでキャプチャされます。
機能仕様を C# 言語標準に導入するプロセスの詳細については、仕様に関する記事を参照してください。
チャンピオンの課題: https://github.com/dotnet/csharplang/issues/4394
概要
プロパティサブパターンが入れ子になったメンバーを参照できるようにします。たとえば、次のようになります。
if (e is MethodCallExpression { Method.Name: "MethodName" })
代わりに:
if (e is MethodCallExpression { Method: { Name: "MethodName" } })
モチベーション
子プロパティを照合する場合、別の再帰パターンを入れ子にするとノイズが増え、実質的な利点がないのに読みやすさが損なわれます。
詳細な設計
property_pattern 構文は次のように変更されます。
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
+ ;
各名前検索の受け取り側は、property_pattern の入力型から始まる前のメンバー T0 の型です。 T が null 許容型である場合、T0 がその基になる型です。それ以外の場合、T0 は Tと等しいです。
たとえば、フォーム { Prop1.Prop2: pattern }
のパターンは、{ Prop1: { Prop2: pattern } }
とまったく同じです。
T が null 許容値型または参照型である場合、これには null チェックが含まれます。 この null チェックは、使用可能な入れ子になったプロパティが、Tではなく、T0のプロパティであることを意味します。
メンバー パスを繰り返し使用できます。 パターン マッチングのコンパイルでは、パターンの一般的な部分を利用できます。
C# feature specifications