2011-02-03 12 views
5

quiero hacer estoC# Lista de fundición <ushort> a la lista <short>

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

pero consigo InvalidCastException "la conversión especificada no es válida."

¿Cómo puedo lanzar de manera rápida y eficiente la colección anterior?

Gracias.

+1

posible duplicado de [desconcierto Enumerable.Cast InvalidCastException] (http://stackoverflow.com/questions/445471/puzzling-enumerable-cast-invalidcastexception) – Ani

+1

@Ani: No lo consideraría un duplicado porque sé que no puedes convertir 'int' a' long' (son de diferentes tamaños), pero esperaría que un molde de 'ushort' a' short' sea posible porque son del mismo tamaño. En otras palabras, '(ushort []) (objeto) new short [] {0, -1}' es perfectamente válido C#. – Gabe

+0

@Gabe: Es el mismo problema. '(short) ((ushort) 1)' es C# válido como lo es '(long) ((int) 1)' (conversión redundante para mayor claridad). El problema tiene que ver con mezclar conversiones numéricas y unboxing. http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx – Ani

Respuesta

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

Prefiero esta solución, IMO, ya que es LINQ estándar. –

+0

Lo tuve implementado de esta manera antes de volver a ingresar, y funcionó bien. No estoy seguro de si hay diferencia de rendimiento entre esto y el uso de ConvertAll. –

9

Usted podría utilizar ConvertAll:

List<short> sList = uList.ConvertAll(x => (short)x); 
Cuestiones relacionadas