2012-01-04 20 views
3

なぜ私はちょうどキャストできないのだろうと思っています(私は曖昧な考えを持っていますが、それはその共変のものと何か関係がありますか?)、そして最初の辞書の要素を新しいもの私が望むタイプを得るためには?ディクショナリ<T1、IEnumerable <T2>>にディクショナリ<T1, List<T2>をキャストできないのはなぜですか?

+0

..あなたはおそらく正しく辞書を<>使用していない、あなたのコード例を貼り付け.. – MethodMan

+2

は、これは何回も回答されています。短い答えは、Dictionary >を参照するとT2 []配列を追加することができるため、型がDictionary > –

+0

@James Michael Hareのように正しくないためです。重複して申し訳ありません。誰かがそれを閉じると確信しています。 –

答えて

10

これは同じタイプではないため、実行できません。検討:

 var x = new Dictionary<string, List<int>>(); 

     // won't compile, but assume it could... 
     Dictionary<string, IEnumerable<int>> xPrime = x; 

     // uh oh, would allow us to legally add array of int! 
     xPrime["Hi"] = new int[13]; 

これは意味がありますか? Dictionary<string, List<int>>TValueList<int>であることを示しています。つまり、Add()の値をList<int>とすることができます。あなたはDictionary<string, IEnumerable<int>>にこれをキャストすることができれば、それは値型を意味するであろうことは、あなたに意味するでしょうIEnumerable<int>である可能性Add()任意の元の型に違反するIEnumerable<int>int[]HashSet<int>、など)。

ので、List<T>IEnumerable<T>を実装List<T>のでIEnumerable<T>参照に変換することができますが、それはDictionary<TKey, List<TValue>>実装/はDictionary<TKey, IEnumerable<TValue>>を拡張することを意味するものではありません。

もっと簡単に言えば:後者はあなたが猫、リスを追加できるようになるので

Dictionary<int, Dog> 

Dictionary<int, Animal> 

に変換できません、など

+0

意味があります。私はコピーを作成します(私は実際に結果のコレクションを変更することはしませんが、型システムはそれを知らない)。 –

+0

JCooper:上記のpstのように、LINQを使用すると、 'Dictionary > xPrime = x.ToDictionary(pair => pair.Key、pair => pair.Value)のようにすることができます。 AsEnumerable()); ' –

-1

はい、共分散の問題です。私はこれが.net 4.0で修正されたと信じています。

+4

JasonMeckley:リストをIEnumerable に変換することはできますが、Dictionary > –

+0

@JamesMichaelHareに辞書を変換することはできません。私の前提は間違っていた。 –

+1

心配はいりません。微妙なことを完全に見るにはしばらく時間がかかりました。 –

1

あなたはキャストすることはできません、まだあるからDictionary<T1, List<T2>>

いいえ、

0それは非常に頻繁に問題だとして
Dictionary<string, List<int>> d1 = new Dictionary<string, List<int>>(); 
Dictionary<string, IEnumerable<int>> d2 = (Dictionary<string, IEnumerable<int>>)d1; // this is the invalid cast 
d2["one"] = new int[0]; // valid for d2 
List<int> list1 = d1["one"]; // would fail 
関連する問題