2010-09-08 7 views
2

code suivant se comporte étrange (au moins pour moi):Pourquoi cette conversion ne fonctionne-t-elle pas?

int testValue = 1234; 

this.ConversionTest(testValue); 

private void ConversionTest(object value) 
{ 
    long val_1 = (long) (int) value; // works 
    long val_2 = (long) value;  // InvalidCastException 
} 

Je ne comprends pas pourquoi la distribution directe (explicite) et à long ne fonctionne pas. Quelqu'un peut-il expliquer ce comportement?

Merci

+0

Il s'agit d'une question très fréquemment posée. Mon article sur le sujet est ici: http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx –

+0

Notez également qu'il s'agit d'un doublon de nombreux précédents Stack Overflow questions, comme celui-ci: http://stackoverflow.com/questions/1812172 ou celui-ci: http://stackoverflow.com/questions/2651754 ou celui-ci: http://stackoverflow.com/questions/1667169 ou celui-ci: http://stackoverflow.com/questions/1085097 –

Répondre

3

Le paramètre value de votre méthode ConversionTest est entré comme object; cela signifie que tous les types de valeur - par exemple, int - transmis à la méthode seront encadrés.

valeurs Boxed ne peuvent être Unboxed exactement le même type:

  • Lorsque vous (long)(int)value vous êtes le premier unboxing value à un int (son type d'origine), puis la conversion de ce int à un long.
  • Lorsque vous faites (long)value, vous tentez de décocher la boîte int en long, ce qui est illégal.
Questions connexes