次の方法で共有


拡張プロパティのパターン

手記

この記事は機能仕様です。 仕様は、機能の設計ドキュメントとして機能します。 これには、提案された仕様の変更と、機能の設計と開発時に必要な情報が含まれます。 これらの記事は、提案された仕様の変更が最終決定され、現在の 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 がその基になる型です。それ以外の場合、T0Tと等しいです。

たとえば、フォーム { Prop1.Prop2: pattern } のパターンは、{ Prop1: { Prop2: pattern } }とまったく同じです。

T が null 許容値型または参照型である場合、これには null チェックが含まれます。 この null チェックは、使用可能な入れ子になったプロパティが、Tではなく、T0のプロパティであることを意味します。

メンバー パスを繰り返し使用できます。 パターン マッチングのコンパイルでは、パターンの一般的な部分を利用できます。