2010-09-08 109 views
2

下面的代码(至少对我来说)的行为奇怪:为什么此转换不起作用?

int testValue = 1234; 

this.ConversionTest(testValue); 

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

我不明白为什么直接的(明确的)强制转换为长不起作用。 有人可以解释这种行为吗?

感谢

+0

这是一个非常常见的问题。关于这个问题的文章在这里: http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx – 2010-09-08 15:09:01

+0

请注意,这是许多以前的重复堆溢出问题,如这一个:http://stackoverflow.com/questions/1812172或这一个:http://stackoverflow.com/questions/2651754或这一个:http://stackoverflow.com/questions/1667169或这一个:http://stackoverflow.com/questions/1085097 – 2010-09-08 15:10:12

回答

3

ConversionTest方法的value参数的类型为object;这意味着传递给该方法的任何值类型(例如int)都将被装箱。

盒装的值只能是拆箱完全相同的类型:

  • 当你做(long)(int)value你先拆箱valueint(原来的类型),然后将那intlong
  • 当你做(long)value你试图解开盒子intlong,这是非法的。