W C # dlaczego nie można przechowywać obiektu List w zmiennej List
Wygląda na to, że obiekt List nie może być przechowywany w zmiennej List w języku C # i nie można go nawet jawnie rzutować w ten sposób.
List<string> sl = new List<string>();
List<object> ol;
ol = sl;
wyniki nie mogą niejawnie konwertować typu
System.Collections.Generic.List & < string & >na
System.Collections.Generic.List & < object & >I wtedy...
List<string> sl = new List<string>();
List<object> ol;
ol = (List<object>)sl;
wyniki nie mogą konwertować typu
System.Collections.Generic.List & < string & >na
System.Collections.Generic.List & < object & >Oczywiście możesz to zrobić, wyciągając wszystko z listy ciągów i odkładając je pojedynczo, ale jest to dość mylące rozwiązanie.
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
14 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Na marginesie, myślę, że byłoby ważniejsze, gdybyś mógł wykonać tylną obsadę:
Dawno nie używałem C #, więc nie wiem, czy jest to legalne, ale taka obsada jest faktycznie (potencjalnie) przydatna. W tym przypadku przechodzisz z bardziej ogólnej klasy (obiektu) do bardziej szczegółowej klasy (ciągu znaków), która wykracza poza klasę ogólną. W ten sposób, jeśli dodasz łańcuchy do listy, nie zepsujesz listy obiektów.
Czy ktoś wie lub może sprawdzić, czy taka obsada jest legalna w C #?
Anonimowy użytkownik
Potwierdzenie od:
To nie jest dokładnie to, o co prosiłeś, ale powinno działać.
Edycja: jak zauważyła Zooba, możesz wywołać ol.ToList (), aby uzyskać listę
Anonimowy użytkownik
Potwierdzenie od:
Aby to zrobić, przed NET 3.5:
Korzystanie z Linq:
Anonimowy użytkownik
Potwierdzenie od:
W związku z tym jest oczywiste, że kompilator nie może być wystarczająco inteligentny, aby przekonwertować ListString na ListObject przez rzutowanie elementów swojej wewnętrznej kolekcji.
Dlatego istnieją metody rozszerzające dla IEnumerable, takie jak Convert (), które ułatwiają konwersję elementów przechowywanych w kolekcji, co może być tak proste, jak przejście z jednego do drugiego.
Anonimowy użytkownik
Potwierdzenie od:
Zamiast tego możesz wypróbować kod FF:
lub:
ol będzie (teoretycznie) kopiować całą zawartość sl bez problemu.
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
Więcej informacji znajdziesz w
Zobacz Wariancja parametrów typu ogólnego
http://blogs.msdn.com/rmbyers/ ... .aspx
w CLR.
Anonimowy użytkownik
Potwierdzenie od:
http:// blogs.msdn.com/charlie/archive/2008/10/27/linq-farm-covariance-and-contravariation-in-visual-studio-2010.aspx
http://blogs.msdn.com/charlie/ ... .aspx
Anonimowy użytkownik
Potwierdzenie od:
W Javie jest odwrotnie, nie masz typów ogólnych, a zamiast tego wszystko jest listą obiektów w czasie wykonywania i możesz umieścić dowolny dziwny obiekt na swojej rzekomo mocno wpisanej liście. Wyszukaj „Reified generics”, aby zobaczyć szersze omówienie problemu z Javą ...
Anonimowy użytkownik
Potwierdzenie od:
C # sprawdza w czasie wykonywania, więc nie można umieścić, powiedzmy, w .
Anonimowy użytkownik
Potwierdzenie od:
(Na przykładzie Zooba)
Anonimowy użytkownik
Potwierdzenie od:
Zamierzałem wypełnić go danymi zebranymi w , co ostatecznie zadziałało, to:
jest typem, dla którego chcesz uzyskać z tego typu, a następnie wpisz na liście , który chcesz.
Anonimowy użytkownik
Potwierdzenie od:
Drugim jest uniknięcie typu obiektu IEnumerable, po prostu rzutowanie ciągu na typ obiektu, a następnie użycie funkcji „toList ()” w tym samym zdaniu:
Drugi sposób bardziej mi się podoba. Mam nadzieję że to pomoże.
Anonimowy użytkownik
Potwierdzenie od: