2012-04-30 9 views
6

El código siguiente falla en la última asignación:C# INT u objeto-a-doble explicación de fundición de error

static void Main(string[] args) 
{ 
    int a = 5; 
    object b = 5; 

    System.Diagnostics.Debug.Assert(a is int && b is int); 

    double x = (double)a; 
    double y = (double)b; 
} 

Si tanto a como b son int, ¿cuál es la causa de este error?

+0

posible duplicado de [Casting a boxed value] (http://stackoverflow.com/questions/5312731/casting-a -boxed-value) – Brian

Respuesta

15

Unboxing requiere el tipo exacto - usted puede hacer esto en su lugar:

double y = (double)(int)b; 
+0

Interesante. ¡Gracias! – digdig

20

Esta es una cuestión extremadamente preguntas más frecuentes. Ver http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx para una explicación.


Fragmento:

consigo un buen número de preguntas sobre el operador de C# fundido. La pregunta más frecuente que recibo es:

short sss = 123; 
object ooo = sss;   // Box the short. 
int iii = (int) sss;   // Perfectly legal. 
int jjj = (int) (short) ooo; // Perfectly legal 
int kkk = (int) ooo;   // Invalid cast exception?! Why? 

¿Por qué? Porque un T en caja solo se puede desempaquetar en T. (*) Una vez que se desempaqueta, es solo un valor que se puede lanzar como siempre, por lo que el doble elenco funciona bien.

(*) O Nullable<T>.

0

a es un int, pero b es una referencia a un objeto que es una int - que es lo que se llama una caja int. Son dos cosas diferentes, de ahí los diferentes comportamientos.

1

El lanzamiento implícito es una operación en tiempo de compilación. No es posible para b del tipo object.