2011-12-20 101 views
9

尝试这样的事情时,遇到了一个InvalidCastException:无法将列表<KeyValuePair <...,...>>转换为IEnumerable <object>?

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>; 

回答

17

这是因为KeyValuePair<K,V>是不是一类,是一个结构。要转换列表中IEnumerable<object>将意味着你必须要每个键 - 值对和框它:

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

因为你必须每个项目转换列表中,你不能简单地铸造做到这一点列出它自己。

2

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

3

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

无论如何,如果你想使用的列表中,您需要使用铸造法的KeyValuePair结构转换成一个对象:

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