日期:2014-05-19  浏览次数:21016 次

一个简单的难题,这个object的内存是怎么回事情?
Int16   x   =   12;
Int32   y   =   (Int32)x;//成功

object   z   =   x;
Int32   w   =   (Int32)z;//运行时失败,为什么呢?

------解决方案--------------------
object 是所有类的父类,因此你可以把所有的子类转换为父类,但你下面的两句代码:
object z = x;
Int32 w = (Int32)z;
就是把父类z转换为子类Int32,这样的转换是不允许的,肯定有错误了
------解决方案--------------------
Int32 w = (Int32)z
改成
Int32 w = (Int32)((Int16)z)
------解决方案--------------------
这样子的话,在object y = x;这一步y隐逝转换,其实y已经是Int32类型的了。
------解决方案--------------------
Int16 x = 12;
Int32 y = (Int32)x;//成功
object z = x;
Int32 w = (Int16)z;//这样就行了

装箱和拆箱要同一类型才行。
------解决方案--------------------
C#是强类型语言,许多类型转换都是要显示转换的。

------解决方案--------------------
用Conver类就可以达到预期的效果,但是不知道强制转换为什么不行。

object 是 int 的父类。
c#规定:子类可以转换成父类,反之不行,编译时就会报错提示你。
具体会什么不行,只是因为c#这样规定的。(任何语言都不可能把子类转成父类,因为
这和客观事物不相符)

covert是显示转换,编译器会让你通过,它的错误会留到运行时。
最好放在try{} catch{}结构中,但是这样一但有错会很费服务器资源。
2.0提供TryToInt32(),MS把这个弄好了,如果转换失败返回0
------解决方案--------------------
Int16 x = 12;
Int32 y = (Int32)x;

object z = x;
Int32 w = (Int32)z;
这两个转换是不一样的,前者利用重载的构造函数生成Int32对象,后者仅仅是拆箱而已。如果比较一下生成的CLR代码就能看出来。
任何重载都是编译期决定的,对于Int32 w = (Int32)z编译器并不知道z的类型是Int16,必须显式的告诉编译器。

Convert的实现是很复杂的,只是使用起来感觉和强制转化差不多而已。对于已确定类型的值,用强制转化,对不确定类型的,用Convert。
------解决方案--------------------
用as转
------解决方案--------------------
是个难题