2011-02-03 15 views
5

chcę zrobić tenC do listy <short>

List<ushort> uList = new List<ushort>() { 1, 2, 3 }; 
List<short> sList = uList.Cast<short>().ToList(); 

ale mam InvalidCastException "określonych oddanych nie jest prawidłowy."

Jak mogę szybko i skutecznie obsłużyć powyższą kolekcję?

Dziękuję.

+1

możliwe duplikat [Puzzling Enumerable.Cast InvalidCastException] (http://stackoverflow.com/questions/445471/puzzling-enumerable-cast-invalidcastexception) – Ani

+1

@Ani: Nie uważam tego za duplikat, ponieważ wiem, że nie możesz rzucić 'int' na' long' (mają różne rozmiary), ale spodziewam się, że rzut od 'ushort' do' short' będzie możliwe, ponieważ są tej samej wielkości. Innymi słowy, '(ushort []) (object) new short [] {0, -1}' jest całkowicie poprawny C#. – Gabe

+0

@Gabe: To ten sam problem. '(short) ((ushort) 1)' jest poprawny C# jak jest '(long) ((int) 1)' (nadmiarowy rzut dla jasności). Problem polega na mieszaniu liczbowych konwersji i rozpakowywaniu. http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx – Ani

Odpowiedz

7
List<short> sList = uList.Select(i => (short)i).ToList(); 
+0

Preferuję to rozwiązanie, IMO, ponieważ jest to standardowe LINQ. –

+0

Mam to zaimplementowane w ten sposób, zanim ponownie się tutaj sprawdziłem i wszystko działało dobrze. Nie jestem pewien, czy istnieje różnica w wydajności między tym i użyciu ConvertAll. –

9

Można użyć convertall:

List<short> sList = uList.ConvertAll(x => (short)x); 
Powiązane problemy