2017-02-03 12 views
5

個人的に、私は残念であると考えられるもの動的がパターンマッチングに使用することができない知っている:(パターンマッチングの仕組みにはどのような制限がありますか?

dynamic foo = 10; 
switch(foo) { 
    case int i: 
    break; 
} 

また、値のタプル/ネオタプルがパターンマッチングに使用できません

dynamic foo = (420, 360); 
switch(foo) { 
    case (int, int) i: 
    break; 
} 

これは、C#7の現在のバージョンで除去し、将来の使用のために割り当てられました。

私が行うことができない他のものは何ですか?

+1

投票は再オープンする制限はロザリンの問題に記載されていますし、正確にそうするために時間を取って喜んで誰かによってここにまとめることができ、このよう。 –

+0

@DavidArno - これを実際に提案されたアイデアに限定したい場合は、しかし、「私ができないことは他に何がありますか」と尋ねるとき、確かにそれは無限のリストですか? –

+0

@Damien_The_Unbeliever、質問を再構成してOPを助けて、無限の回答を必要としないのはなぜですか? –

答えて

6

は、C#7の特徴に一致する新しいパターンは、以下から成る:型スイッチング用

  • サポート、文をケースするvarパターン、
  • whenガードの添加
  • 簡単な使用、
  • x is T yパターン式。

あなたの例は、これらの最初のものに焦点を当てています。そして、これらの新機能の中で最も一般的に普及しているのがタイプ切り替えです。あなたが言及するような制限がありますが、他の機能を使用してそれらの多くを回避することができます。

たとえば、あなたの最初の制限は、簡単にobjectにボクシングfooによって解決される:予想通り

dynamic foo = 10; 
switch ((object)foo) 
{ 
    case int i: 
     Console.WriteLine("int"); 
     break; 
    default: 
     Console.WriteLine("other"); 
     break; 
} 

intを印刷します。

VARパターンとガードは、あなたの第二の制限を回避するために使用することができます。

dynamic foo = (420, 360); 
switch (foo) 
{ 
    case var ii when ii.GetType() == typeof((int, int)): 
     Console.WriteLine("(int,int)"); 
     break; 
    default: 
     Console.WriteLine("other"); 
     break; 
} 

(int,int)を印刷します。

var foo = (420, 360); 
switch (foo) 
{ 
    case ValueTuple<int,int> x: 
     Console.WriteLine($"({x.Item1},{x.Item2})"); 
     break; 
    default: 
     Console.WriteLine("other"); 
     break; 
} 

上記(420,360)を印刷します:

また、値のタプルが型スイッチングのために使用することができ、あなただけの長い手の構文を使用する必要があります。

個人的には、C#7のパターンマッチングの最大の制限はmatchキーワードを使用しての式のパターンマッチングの欠如です。もともと、以下は、このリリースのために計画されたが、pulled due to time constraintsだった。

var x = 1; 
var y = x match (
    case int _ : "int", 
    case * : "other" 
); 

これはswitchを使用して回避することができますが、それは厄介だ:

var x = 1; 
var y = IntOrOther(x); 

... 

private string IntOrOther(int i) 
{ 
    switch (i) 
    { 
     case int _ : return "int"; 
     default: return "other"; 
    } 
} 

しかし助けは、多くのサードパーティとここに手元にありますこれは、0を持つほど良好ではないのです

var x = 1; 
var y = x.TypeMatch().To<string>() 
     .Caseof<int>().Do("int") 
     .Else("other") 
     .Result(); 

:としてあなたはそれを書くのを聞かせて、このようなSuccinc<T> library私自身としてのライブラリを、パターンマッチングキーワードですが、それ以降の言語リリースでその機能が表示されるまで、オプションの回避策です。

C#7で課せられた制限を理解するには、pattern matching spec on GitHubを参照し、C#の次のリリースの内容と比較することをお勧めします。しかし、それを見ると、これらのすべてに対処法があることが明らかになります。

この質問は、現在のフレーズでは無期限であるため、もともと閉じていました。いくつかの愚かな例を挙げると、C#7のパターンマッチングは、完璧なコーヒーを作ったり、数秒で世界を飛び回ったりすることができないという制限がありますが、質問の精神に答えることを好みます。答えは本当に唯一の制限はあなたの想像力です。あなたがそれを制限することを許さないなら、回避策がパフォーマンスに影響を与えるという事実を考慮する必要があります。彼らはおそらく唯一の現実的な制限です。

+0

あなたはラムダhttps://gist.github.com/bradphelan/350da3554ca8db3f0fa90ee598dabe58 – bradgonesurfing

+0

@bradgonesurfingにスイッチを入れることで一致式偽物、お気軽にすることができます - あなたがしたい場合は - それを含めるように私の答えを編集して、だけでなくしますそれをコメントとして持っています。 –

関連する問題