擴展屬性模式
注意
本文是功能規格。 規格可作為功能的設計檔。 其中包含建議的規格變更,以及功能設計和開發期間所需的資訊。 這些文章會發佈,直到提議的規格變更完成並併併入目前的ECMA規格為止。
功能規格與已完成實作之間可能有一些差異。 這些差異被記錄在相關的 語言設計會議(LDM)記錄中。
冠軍問題: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的屬性。
允許重複的成員路徑。 模式比對的編譯可以利用模式中相似的部分。