Dictionary <int,list <t =“”>&gt;之间没有赋值兼容性和IDictionary <int,ienumerable <t =“”>&gt;?</int,> </int,>

时间:2013-01-29 03:08:11

标签: c# generics covariance

我正在尝试将Dictionary<int, List<T>>传递给需要IDictionary<int, IEnumerable<T>>的构造函数。

不幸的是,通用IDictionary未定义为IDictionary<TKey, out TValue>。也许这没有意义,但有没有一个演员可以让我把我的字典传递给构造函数?

明显的强制转换((IDictionary<int, IEnumerable<T>>)dictionary)在运行时失败。

2 个答案:

答案 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());