私はそれがIDictionary<TKey, IEnumerable<TValue>>
絶対にしないようにIDictionary<TKey, IList<TValue>>
オブジェクトをキャストすることは非常に簡単だと思うだろう。タイプセーフではありません。ここでは、なぜないの例です:
// This is fine...
IDictionary<string, IList<int>> dictionary = new Dictionary<string, IList<int>>();
// Suppose this were valid...
IDictionary<string, IEnumerable<int>> badDictionary = dictionary;
// LinkedList<T> doesn't implement IList<T>
badDictionary["foo"] = new LinkedList<int>();
// What should happen now?
IList<int> bang = dictionary["foo"];
あなたが見ることができるように、それは問題を起こすために起こっている - 私たちはすべての値がIList<int>
を実装することを期待するときLinkedList<int>
アウトを取得しようとするだろう。ジェネリックのポイントはタイプセーフなので、どのラインが失敗すると思いますか?第1、第3、第4行は、私にはかなり明確に有効に見える - そうもう一つはコンパイルに失敗することができる唯一のあり、そしてそれは...
今すぐ一部例では、それができるん安全に完了しました。たとえば、IEnumerable<string>
からIEnumerable<object>
に変換するには、IEnumerable<T>
は "出力"の位置にT
しか使用しないので、(C#4では)変換できます。
詳細はMSDNを参照してください。
EDIT:明らかにするために、新しい辞書を既存のキーと値のペアのコピーで簡単に作成できます。リンクを使用して:
var copy = original.ToDictionary<TKey, IEnumerable<TValue>>(pair => pair.Key,
pair => pair.Value);
あなたは今すぐ別々の2つの辞書があることに気づく必要があります。
これは私には意味がありません。 'IEnumerable <>'は 'IList <>'から継承しませんが、これは逆です。明らかに間違っているようです。子孫ではなく、祖先としてキャストできますか?だから、それはどのようにダウンキャスティングを無効にしますか? –
@JeremyHolovacs:私の例はあなたがしたいことを*正確に*しようとしました: 'IDictionary>を' IDictionary > 'に変換してください。それがあなたがしたいことでない場合は、あなたの質問を明確にする必要があります。 –
最後の行はまったく同じようには見えません。あなたは 'IEnumerable'を 'IList 'に変換しようとしているようで、明らかに間違っているようです。 'IList'が' IEnumerable'から継承しているので、 'IList 'を 'IEnumerable 'に変換するのは、完全に正当なものでなければなりません。 –