最初有望在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
;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