扩展属性模式

注意

本文是特性规范。 该规范充当该功能的设计文档。 它包括建议的规范更改,以及功能设计和开发过程中所需的信息。 这些文章将发布,直到建议的规范更改最终确定并合并到当前的 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

允许重复的成员路径。 模式匹配编译时可以利用模式中的常见部分。