共用方式為


擴展屬性模式

注意

本文是功能規格。 規格可作為功能的設計檔。 其中包含建議的規格變更,以及功能設計和開發期間所需的資訊。 這些文章會發佈,直到提議的規格變更完成並併併入目前的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
+ ;

每個名稱查找的接收方是上一個成員 T0的類型,從 property_pattern輸入類型 開始。 如果 T 是可為 Null 的類型,T0 是其基礎類型,否則 T0 等於 T

例如,表單 { Prop1.Prop2: pattern } 的模式與 { Prop1: { Prop2: pattern } }完全相同。

請注意,當 T 為可為空的值型別或參考型別時,這會包含空檢查。 這個 Null 檢查表示可用的巢狀屬性會是 T0的屬性,而不是 T的屬性。

允許重複的成員路徑。 模式比對的編譯可以利用模式中相似的部分。