2012-04-30 8 views
6

Il codice qui sotto non riesce all'ultimo incarico:C# INT o object-to-doppia fusione errore spiegazione

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; 
} 

Se sia a che b sono int, qual è la causa di questo errore?

+0

possibile duplicato di [Casting a boxed value] (http://stackoverflow.com/questions/5312731/casting-a-boxed-value) – Brian

risposta

15

Unboxing richiede l'esatto tipo - si può fare questo, invece:

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

Interessante. Grazie! – digdig

20

Questa è una domanda estremamente domande più frequenti. Vedere http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx per una spiegazione.


Snippet:

ottengo un buon numero di domande circa l'operatore C# cast. La domanda più frequente che ottengo è:

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? 

Perché? Perché un T scatolato può essere rimosso solo da T. (*) Una volta che è unbox, è solo un valore che può essere lanciato come al solito, quindi il doppio cast funziona perfettamente.

(*) O Nullable<T>.

0

a è un int, ma b è un riferimento ad un oggetto che è un int - è quello che viene chiamato un int scatola. Sono due cose diverse, quindi i diversi comportamenti.

1

Il cast implicito è un'operazione in fase di compilazione. Non è possibile per b di tipo object.