2017-12-17 29 views
3

私はこの行書く時:C#7.0タプル控除

Tuple<string,string> key = (controller, action); 

を、私はこのエラーを取得する:

Severity Code Description Project File Line Suppression State Error CS0029 Cannot implicitly convert type '(string controller, string action)' to 'System.Tuple' Project.Web PageMetadata.cs 27 Active

これは新しいタプルの拡張機能のかなりストレートフォワード、直感的なアプリケーションのように思えますC#7アップデートの中心にありますが、それでも動作しません。私は間違って何をしていますか?

答えて

5

新しいタプルの機能はValueTupleタイプ、すなわち

ValueTuple<string, string> key = (controller, action); 

または

var key = (controller, action); 

を必要とし、それはTupleはクラスであり、ValueTupleが構造体であることに注意することが重要です。それらを混ぜ合わせるべきではありません。 C#7の新しいタプル機能の詳細については、hereを参照してください。

0

Tuple<string, string>の代わりにValueTuple<string, string>を使用してください。 Tuple<T1,T2>は、C#7.0より前のシステムタイプです。 ValueTuple<T1,T2>は、新しい言語機能をサポートするものです。詳細はthe C# Tuple type guideを参照してください。

0

あなたが本当に(タプル構文で使用される)System.TupleからSystem.ValueTupleに変換する必要がある場合、またはバック、拡張メソッドがあります。ToTupleToValueTuple小さなアリティのために定義されました。

2

まず、新しいスタイルタプル(ValueTuple)を古いスタイルタプル(Tuple)にキャストしようとすると、そのエラーが発生します。

この

ToTuple()拡張メソッドを使用して達成することができます。

Tuple<string,string> key = (controller, action).ToTuple();   

しかし、それはおそらく、あなたがやろうとしているものではありません。

ValueTuple<string,string> key = (controller, action); 

をしかし、あなたがそれを行う場合、あなたはまだ重要な機能の一つを破りItem1Item2と呼ばれている2つの要素で終わる:あなたは新しいタプルのインスタンスを作成する場合は、行うことができます新しいタプル構文の名前付き要素。 varを使用するように変更して、そしてあなたは、その後の要素の名前を取得:

:あなたは本当に(一部の民族にはない) varを使用して好きではない場合、あなたはまだ、これらの名前の要素を取得するために、手書きそれを表現することができます

var key = (controller, action); 
Console.WriteLine(key.controller); // key.controller is now valid 

(string controller, string action) key = (controller, action); 
Console.WriteLine(key.controller); 
関連する問題