2

我正在尝试将 a 传递给Dictionary<int, List<T>>需要 a 的构造函数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”是一个助记符,它告诉您“value 参数仅用于输出”,但显然 value 参数用于输入到字典中。

于 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 回答