我正在尝试将 a 传递给Dictionary<int, List<T>>
需要 a 的构造函数IDictionary<int, IEnumerable<T>>
。
不幸的是,泛型IDictionary
没有定义为IDictionary<TKey, out TValue>
. 也许这没有意义,但是是否有一个演员可以让我将我的字典传递给构造函数?
明显的强制转换 ( (IDictionary<int, IEnumerable<T>>)dictionary
) 在运行时失败。
我正在尝试将 a 传递给Dictionary<int, List<T>>
需要 a 的构造函数IDictionary<int, IEnumerable<T>>
。
不幸的是,泛型IDictionary
没有定义为IDictionary<TKey, out TValue>
. 也许这没有意义,但是是否有一个演员可以让我将我的字典传递给构造函数?
明显的强制转换 ( (IDictionary<int, IEnumerable<T>>)dictionary
) 在运行时失败。
不,因为那不安全:
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 参数用于输入到字典中。
您可以使用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());