C# 7はパターンマッチングの基礎を築いたが、多くの機能はCutting Room Floorに置いたままにせざるを得なかった。C# 8で追加の時間をかけて、これらのうちの多くが採用されている。
位置パターンマッチング
C# 7構文を使った、このかなり冗長なパターンを考えてみよう。
case Rectangle r when r.Length == 10 && r.Width == 10: return "Found 10x10 rectangle";
デコンストラクタ機能を利用することで、新しい位置パターンマッチングにより、機能の冗長度が大幅に低下する。
case Rectangle (10, 10): return "Found 10x10 rectangle";
この機能は匿名タプルでもサポートされる。これは「タプルパターン」と呼ばれまる。この例はMadの記事C# 8.0のパターンでもっと多くをしようで参照できる。
特性パターンマッチング
位置パターンは簡潔であるが、適切なDeconstructメソッドがある場合にのみ機能する。ない場合は、代わりにプロパティパターンを使用できる。
case Rectangle {Width : 10 }: return "Found a rectangle with a width of 10";
インデックス付きプロパティのサポートも検討されているが、詳細は決定されていない。
デコンストラクタの改善
パターンマッチングで未解決のLDMの問題チケットの下で検討されている別のアイデアは、同じ数のパラメータを持つ、複数のDeconstructメソッドを許可することである。異なる型を持つことに加えて、パラメータは異なる名前を付ける必要がある。
ITupleパターンマッチング
.NET 4.7.1および.NET Core 2.0で導入されたITupleインターフェイスは、C# 8でいくつか質問がある。基本的な考え方は、オブジェクトがこのインターフェイスを実装すれば、パターンマッチングに参加できるということである。これがいつ有効になるかについて、3つのシナリオが検討中である。
if (x is ITuple(3, 4)) // (1) permitted?
if (x is object(3, 4)) // (2) permitted?
if (x is SomeTypeThatImplementsITuple(3, 4)) // (3) permitted?
関連する質問として、クラスがITupleを実装していて、Deconstruct拡張メソッドがある場合に、どちらが優先されるかである。理想的には、それらは同じ値を返すが、そうでない場合はタイブレーカーが必要である。