为什么字典<t1,list <t2 =“”>&gt;被转换为字典<t1,ienumerable <t2 =“”>&gt;?</t1,> </t1,>

时间:2012-01-04 21:25:39

标签: c# .net generics collections casting

我想知道为什么我不能只是演员(我有一个模糊的想法,这可能与那个共同/逆转的东西有关?),我被迫将第一个字典的元素复制到一个新的一个是为了得到我想要的类型?

3 个答案:

答案 0 :(得分:10)

你不能这样做,因为它们不是同一类型。考虑:

        var x = new Dictionary<string, List<int>>();

        // won't compile, but assume it could...
        Dictionary<string, IEnumerable<int>> xPrime = x;

        // uh oh, would allow us to legally add array of int!
        xPrime["Hi"] = new int[13];

这有意义吗?由于Dictionary<string, List<int>>表示TValueList<int>,这意味着您可以Add() List<int>作为值。如果 将其转换为Dictionary<string, IEnumerable<int>>,则表示值类型为IEnumerable<int>,这意味着您可以Add() 任何 { {1}}(IEnumerable<int>int[]等)会违反原始类型。

因此,HashSet<int>可以转换为List<T>引用,因为IEnumerable<T>实现了List<T>,但这并不意味着IEnumerable<T>实现/扩展{ {1}}。

更简单地说:

Dictionary<TKey, List<TValue>>

无法转换为

Dictionary<TKey, IEnumerable<TValue>>

因为后者允许你添加Cat,Squirrel等。

答案 1 :(得分:1)

你无法施放,因为它仍然是Dictionary<T1, List<T2>>

让我们说

Dictionary<string, List<int>> d1 = new Dictionary<string, List<int>>();
Dictionary<string, IEnumerable<int>> d2 = (Dictionary<string, IEnumerable<int>>)d1; // this is the invalid cast
d2["one"] = new int[0]; // valid for d2
List<int> list1 = d1["one"]; // would fail

答案 2 :(得分:-1)

是的,这是协方差的问题。我相信这已得到纠正.net 4.0