¿Alguien puede aclarar la palabra clave C# is
por favor? En particular estas 2 preguntas:¿Por qué "int [] es uint [] == verdadero" en C#
Q1) línea 5; ¿Por qué esto es verdad?
Q2) línea 7; ¿Por qué no hay excepción de lanzamiento?
public void Test()
{
object intArray = new int[] { -100, -200 };
if (intArray is uint[]) //why does this return true?
{
uint[] uintArray = (uint[])intArray; //why no class cast exception?
for (int x = 0; x < uintArray.Length; x++)
{
Console.Out.WriteLine(uintArray[x]);
}
}
}
La descripción de MSDN no aclara la situación. Establece que is
devolverá verdadero si se cumple alguna de estas condiciones. (Http://msdn.microsoft.com/en-us/library/scekt9xw(VS.71).aspx>MDSN artículo)
expression is not null. expression can be cast to type.
No creo que se puede hacer un reparto válida de int [] en uint []. Porque:
A) Este código no se compila:
int[] signed = new int[] { -100 };
uint[] unsigned = (uint[])signed;
B) Hacer el molde en el depurador da un error:
(uint[])signed
"Cannot convert type 'int[]' to 'uint[]'"
Efectivamente, si la línea 3 fue int [] en lugar de objeto, entonces nunca compilaría. Lo que me lleva a una pregunta final relacionada con la Q2.
Q3) ¿Por qué C# genera un error de conversión/conversión en el depurador y el compilador pero no en el tiempo de ejecución?
¿Dónde está Eric Lippert cuando lo necesitas? –
Mal, esto es Stack Overflow, quieres decir "¿Dónde está Jon Skeet cuando lo necesitas?" ;) – Ash
Compruebe mi respuesta, actualicé con un enlace a un video que creo que explica el problema subyacente. ¡Echale un vistazo! –