2

Dictionary<int, List<T>>を必要とするコンストラクタにを渡そうとしていIDictionary<int, IEnumerable<T>>ます。

残念ながら、ジェネリックIDictionaryは として定義されていませんIDictionary<TKey, out TValue>。おそらくこれは意味がありませんが、辞書をコンストラクターに渡すことができるキャストはありますか?

明らかなキャスト ( (IDictionary<int, IEnumerable<T>>)dictionary) は実行時に失敗します。

4

2 に答える 2

9

いいえ、それは安全ではないため:

Dictionary<int, List<int>> mydictionary = whatever;
Dictionary<int, IEnumerable<int>> converted = (Dictionary<int, IEnumerable<int>>) mydictionary;
converted.Add(10, new int[] { 1, 2, 3 } );

そして、リストしか保持できない配列をディクショナリに追加しました。安全にする方法がないため、これは許可されません。

辞書インターフェースは共変ではないことに注意してください。共変にならないのはまさにこの理由です。共変アノテーションの「out」は、「値パラメーターは出力にのみ使用される」ことを示すニーモニックですが、明らかに値パラメーターは辞書への入力に使用されます。

于 2013-01-29T03:21:37.670 に答える
1

Enumerable.ToDictionaryメソッドを使用して、元の辞書から必要な辞書を取得できます。

var d = new Dictionary<int, List<int>> { { 1, new List<int> { 1 } } };
IDictionary<int, IEnumerable<int>> id = 
                         d.ToDictionary(p => p.Key, p => p.Value.AsEnumerable());
于 2013-01-29T03:16:49.843 に答える