Como sabemos, los objetos C# tienen un puntero a su tipo, por lo que cuando llama al GetType()
, comprueba ese puntero y devuelve el tipo real de un objeto. Pero si hago esto:¿Qué sucede realmente cuando haces GetType()?
A objA = new A();
object obj = (object)objA;
if (obj.GetType() == typeof(object)) ; // this is true
Pero lo que sucede aquí object obj = (object)objA;
? ¿Crea algún tipo de objeto de referencia, que hace referencia a objA
, pero tiene un puntero de tipo a object
, o es un objeto completamente nuevo, que simplemente apunta a las mismas propiedades, campos, etc. como objA
? Ciertamente, ahora puede acceder a ambos objetos y tendrán un tipo diferente, pero apuntan a los mismos datos. ¿Cómo funciona?
La otra pregunta es: ¿se garantiza GetType() para devolver el tipo real de un objeto? Por ejemplo, supongamos que hay un método con la firma void Method(object sender)
y pasamos el objeto del tipo A
como parámetro. ¿sender.GetType()
tipo de devolución A
o object
? ¿Y por qué?
Otra cosa difícil es que puedes hacer (A)obj
y funcionará. ¿Cómo funciona CLR ahora que obj
fue una vez del tipo A
?
Estaría encantado de que alguien pudiera desglosarlo un poco más claro que "C# through CLR".
Actualización. Malo, debería haber ejecutado el código antes de publicar la pregunta. Por lo tanto, si GetType()
realmente siempre devuelve el tipo real, todas las demás preguntas se aclararán también.
Su pregunta se basa en una premisa totalmente falsa. La línea marcada "this is true" no es verdadera. Intenta escribir un pequeño programa que realmente se compile y se ejecute si no me crees. GetType() siempre devuelve * el tipo de tiempo de ejecución real * del objeto. Todas sus preguntas se basan en la suposición incorrecta de que el tipo de tiempo de compilación tiene algo que ver con eso. No es asi. –
@Eric, bien que está bien, y eso es lo que siempre pensé, se distrajo con un código diferente comportamiento en un proyecto, mi mal. –