2010-04-16 6 views

Respuesta

17

No, no está colocado en un objeto sin tipo. Para cada tipo de valor, hay un tipo de referencia encuadrado en el CLR. Por lo que tendría algo así como:

public class BoxedInt32 // Not the actual name 
{ 
    private readonly int value; 
    public BoxedInt32(int value) 
    { 
     this.value = value; 
    } 
} 

Ese tipo caja no es accesible directamente en C#, aunque se encuentra en C++/CLI. Obviamente, eso conoce el tipo original. Por lo tanto, en C# debe tener un tipo de tiempo de compilación de object para la variable, pero eso no significa que sea el tipo real del objeto.

Consulte ECMA CLI spec o CLR via C# para obtener más información.

+0

Intersting, gracias Jon. El estado efectivo de Wagner dice: "El boxeo coloca un tipo de valor en un objeto de referencia sin tipo". Estoy bastante seguro de que también dice algo en el sentido de que los objetos en recuadro no contienen ningún tipo de metadatos, aunque no puedo encontrar esa cita en particular ahora mismo. Fue al leer ese libro que me ocurrió la pregunta. – fearofawhackplanet

+0

@fearofawhackplanet: no me gustaría poner palabras en la boca de Bill sobre exactamente lo que quiso decir con eso, pero el objeto de la caja definitivamente * conoce * su tipo original, incluidas las enumeraciones. (Escriba un valor enum y luego use ToString directamente sin unboxing como prueba :) –

+1

Creo que una buena demostración es esta. 'long l = 40L; objeto o = (objeto) l; Console.WriteLine (o.GetType()); 'En este caso, System.Int64 se imprime en la pantalla. Aunque 'o' es un objeto, el tipo subyacente sigue siendo largo. –

6

La respuesta de Jon Skeet cubre el por qué; en cuanto a la forma de evitarlo, esto es lo que tiene que hacer:

long l = 1; 
object obj = (object)l; 
double d = (double)(long)obj; 

La razón para el reparto doble es esta; cuando .NET desempaqueta la variable, solo sabe cómo desempaquetarla en el tipo en el que estaba encuadrada (long en su ejemplo). Una vez que la haya desempaquetado y tenga una primitiva long correcta, puede convertirla en double o cualquier otro tipo moldeable de long.

Cuestiones relacionadas