无法将List<KeyValuePair<...,...>>转换为IEnumerable<object>?

10

尝试以下操作时,会收到 InvalidCastException 错误:

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

不过,这个方法确实有效:

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

那么它们之间有什么大的区别呢?为什么一个KeyValuePair不能转换成一个object?

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

object test = (object)KeyValuePair<string,string>;
4个回答

20

这是因为KeyValuePair<K,V>不是一个类,而是一个结构体。如果要将列表转换为IEnumerable<object>,那么就意味着您需要将每个键值对装箱:

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

由于您需要转换列表中的每个项,所以不能仅通过将列表本身强制转换来完成此操作。


13

3
一个 KeyValuePair 是一个结构体,不继承自类对象。

3

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接