注意
本文是特性规范。 该规范充当该功能的设计文档。 它包括建议的规范更改,以及功能设计和开发过程中所需的信息。 这些文章将发布,直到建议的规范更改最终确定并合并到当前的 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 的值类型或引用类型时,这将包括 null 检查。 此 null 检查意味着可用的嵌套属性将是 T0的属性,而不是 T。
允许重复的成员路径。 模式匹配编译时可以利用模式中的常见部分。