我正在尝试将Dictionary<int, List<T>>
传递给需要IDictionary<int, IEnumerable<T>>
的构造函数。
不幸的是,通用IDictionary
未定义为IDictionary<TKey, out TValue>
。也许这没有意义,但有没有一个演员可以让我把我的字典传递给构造函数?
明显的强制转换((IDictionary<int, IEnumerable<T>>)dictionary
)在运行时失败。
答案 0 :(得分: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参数用于输入字典。
答案 1 :(得分: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());