2011-12-20 22 views
9

Pierwsze InvalidCastException gdy próbuje coś takiego:Nie można przekonwertować listy <KeyValuePair <...,...>> na IEnumerable <object>?

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

Jednak to nie praca:

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

Więc co to za duża różnica? Dlaczego KeyValuePair nie można przekonwertować na obiekt?

Aktualizacja: Powinienem chyba podkreślić, że to nie działa:

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

Odpowiedz

17

To dlatego KeyValuePair<K,V> nie jest klasą, jest a struct. Aby przekonwertować lista do IEnumerable<object> oznaczałoby, że trzeba podjąć każdą parę klucz-wartość i pole go:

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

jak trzeba konwertować każdą pozycję na liście, nie można tego zrobić po prostu przez odlewanie sama lista.

2

A KeyValuePair jest strukturą i nie dziedziczy po obiekcie klasy.

3

Przede wszystkim słownik jest już kolekcją KeyValuePairs, dlatego drugi przykład to rzut całego Dictionary na obiekt, a nie KeyValuePairs.

W każdym razie, jeśli chcesz korzystać z listy, trzeba użyć metody Cast w celu przekształcenia struktury KeyValuePair do obiektu:

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