无法转换List <keyvaluepair <...,...>&gt;到IEnumerable <object>?</object> </keyvaluepair <...,...>

时间:2011-12-20 13:49:20

标签: c#

尝试这样的事情时获取InvalidCastException:

IEnumerable<object> test = (IEnumerable<object>)new List<KeyValuePair<string, int>>();

然而,这确实有效:

IEnumerable<object> test = (IEnumerable<object>)new List<Dictionary<string, int>>();

那么最大的区别是什么?为什么KeyValuePair不能转换为对象?

更新:我应该指出这确实有效:

object test = (object)KeyValuePair<string,string>;

4 个答案:

答案 0 :(得分:17)

那是因为KeyValuePair<K,V>不是一个类,是一个结构。要将列表转换为IEnumerable<object>,意味着您必须获取每个键值对并将其装箱:

IEnumerable<object> test = new List<KeyValuePair<string, int>>().Select(k => (object)k).ToList();

由于您必须转换列表中的每个项目,因此您无法通过简单地转换列表本身来实现此目的。

答案 1 :(得分:11)

因为它是一个结构,而不是一个类:http://msdn.microsoft.com/en-us/library/5tbh8a42.aspx

答案 2 :(得分:3)

首先,Dictionary已经是KeyValuePairs的集合,因此第二个示例是将整个Dictionary转换为对象,而不是KeyValuePairs。

无论如何,如果你想使用List,你需要使用Cast方法将KeyValuePair结构转换为一个对象:

IEnumerable<object> test = (IEnumerable<object>)new List<KeyValuePair<string, int>>().Cast<object>();

答案 3 :(得分:2)

KeyValuePair是一个结构,不会从类对象继承。