尝试这样的事情时获取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>;
答案 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
是一个结构,不会从类对象继承。