IDictionary<TKey, IList<TValue>>
オブジェクトをにキャストするのはかなり簡単だと思いますIDictionary<TKey, IEnumerable<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"];
ご覧のとおり、これは問題を引き起こします。LinkedList<int>
すべての値が実装されることを期待しているときに、問題を解決しようとしていますIList<int>
。ジェネリックスのポイントはタイプセーフであることです-では、どの行が失敗すると予想しますか?1行目、3行目、4行目は、私には非常に明確に有効に見えます。したがって、2行目は、コンパイルに失敗する可能性がある唯一の行です。
これで、場合によっては、安全に実行できます。たとえば、「出力」位置でのみ使用されるため、(C#4では)からIEnumerable<string>
に変換できます。IEnumerable<object>
IEnumerable<T>
T
詳細については、 MSDNを参照してください。
編集:明確にするために-既存のキーと値のペアのコピーを使用して新しい辞書を作成するのは簡単です。たとえば、リンクを使用します。
var copy = original.ToDictionary<TKey, IEnumerable<TValue>>(pair => pair.Key,
pair => pair.Value);
2つの別々の辞書があることに注意する必要があります。