Esto es un error en Cast
o ToArray
, la OMI. El código en esta respuesta está en C#, pero con suerte se puede ver de qué se trata :)
Creo que Cast
primero trata de ver si una simple conversión de referencia funcionará, es decir, dónde puede devolver la misma referencia.
Por ejemplo:
String x = "hello";
IEnumerable<char> y = x.Cast<char>();
Console.WriteLine(object.ReferenceEquals(x, y)); // Prints true
Por desgracia, lo hace utilizando las reglas para la compatibilidad CLR - bajo el cual UInt16[]
y Int16[]
son compatibles. Eso lleva a que esto ocurra:
short[] array = new short[]{4, 5, 6};
IEnumerable<ushort> cast = array.Cast<ushort>();
Console.WriteLine(object.ReferenceEquals(array, cast)); // Prints True
Desafortunadamente, si a continuación, intenta llamar ToArray()
, no es feliz:
// Explicit type argument just for clarity
cast.ToArray<ushort>(); // Bang
ToArray
sin duda intenta hacer algo de optimización - que no logra en este caso en particular debido a que la tipo no es lo que realmente espera que sea.
Creo que el comportamiento correcto debe ser Cast
para devolver un iterador perezoso, pero para que falle cuando se ejecuta más tarde. Eso es lo que sucede si intenta pasar de Int16
a Int32
, por ejemplo.
Ahora, para volver a lo que realmente desea hacer: utilice una llamada Select
en su lugar. Cast
solo está destinado a operaciones de unboxing y conversiones de tipo de referencia.
Gracias, desafortunadamente no tengo conocimiento acerca de LINQ y todavía Siempre tengo más cosas urgentes que hacer, ya sabes. Gracias de todos modos. –