2011-12-20 21 views
9

Conseguir una InvalidCastException cuando se trata de algo como esto:no puede convertir List <KeyValuePair <...,...>> IEnumerable a <object>?

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

Sin embargo, este trabajo lo hizo:

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

Entonces, ¿cuál es la gran diferencia? ¿Por qué un KeyValuePair no se puede convertir a un objeto?

actualización: probablemente debería señalar que este hizo el trabajo:

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

Respuesta

17

Eso es porque KeyValuePair<K,V> no es una clase, es una estructura Para convertir la lista para IEnumerable<object> significaría que usted tiene que tomar cada par clave-valor y la caja es:

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

Como usted tiene que convertir cada elemento de la lista, no se puede hacer esto simplemente echando la enumerarse a sí mismo.

2

Un KeyValuePair es una estructura y no se hereda de la clase de objeto.

3

En primer lugar, el diccionario ya es colección de KeyValuePairs, por lo tanto, el segundo ejemplo es convertir todo el diccionario en un objeto, no en KeyValuePairs.

De todos modos, si desea utilizar la lista, es necesario utilizar el método de conversión para convertir la estructura KeyValuePair en un objeto:

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