最初有望在 C# 7 中出现的高级模式匹配特性已于近日从future
分支中排除出去,放入了该语言的下一个版本中。
Roslyn 的 GitHub 库已经明确了 C# 7 模式匹配的变化范围。尤其是问题#10866 (“将 features/patterns
分支分成两个包含 / 不包含在 C# 7 中的子特性分支”)和 PR #10888 (“去掉高级模式匹配特性的证据”)详尽地描述了这一变化的内容。
正如 InfoQ 几周之前的报道,模式匹配会成为 C# 7 中最吸引人的新特性,对有 F#或 Haskell 背景的程序员而言尤其如此。具体地,新模式匹配特性预计提供如下功能:
- 增强
case
块,允许基于类型或变量范围切换代码执行路径,例如case int x:
或case int x when x > 0
; - 支持“分解(destructuring)”,当满足指定条件时,允许开发人员将一个对象分拆成它自身的部分组件,并创建局部变量引用那些组件。语法
if(person is Professor {Subject is var s, FirstName is "Scott"})
提供了这方面的一个例子。
那么,按照 Roslyn 问题#10866 的描述,用于一些基本模式形式的语法“表达式 is 类型标识符”和“case 模式 when 表达式”已经移到了future
分支,它们会包含在 C# 7 中。相反地,其他特性会留在patterns/features
分支中,这个分支里的特性“可能在以后的版本中提供”。
就是说,那些更高级的模式匹配特性将不会出现在 C# 7 中。Reddit 用户 wreckedadvent 发了一个帖子,有效地解释了那些特性:
- 递归模式形式,比如位置模式(比如
p is Person("Mickey",*)
)、属性模式(比如p is Person {FirstName is "Mickey"}
)、元组模式、通配符*
,等等; let
关键字定义不可变变量(比如let x = e2 when e2 else stmt;
),而不是可变var
;match
允许开发人员编写下面这样的代码:
var result = ... let message = result match ( case Success<string> success: success.Result case Failure err: err.Message case *: "Unknown!" );
- 基于用户定义代码的模式匹配,比如一个用户定义的
is
操作符。
这在 C#开发者社区里引发了一些反响。一方面,那些更热衷于函数式编程的开发者表示,缺少一个让C#更加函数化的特性相对而言是一种欺骗。另一方面,其他开发人员表示,他们不关心或者很高兴C#的演化受到了严格的控制。
查看英文原文: Advanced Pattern Matching Features Removed From C# 7
评论