2009-12-14 11 views

Respuesta

7

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.

+0

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. –

5

Debido Int16 y UInt16 son diferentes tipos. Usted podría intentar esto:

New Int16() {4, 5, 6}.Select(Function(x) CType(x, UInt16)).ToArray() 
+0

Es por eso que estoy llamando Cast ¿no es así? Si fueran del mismo tipo, no se necesitaría Cast. –

+0

'Cast' funciona solo si los tipos son compatibles (uno deriva de otro). 'Int16' y' UInt16' no tienen nada en común. –

+0

Ok, ¿hay alguna manera de hacer lo mismo con un CType en lugar de con un DirectCast? –

Cuestiones relacionadas