日期:2014-05-17  浏览次数:20911 次

为什么这样不能通过编译?int不能转换为ushort?
UInt16 i_16_1 = 1;
  UInt16 i_16_2 = 2;
  UInt16 i_16_3 = i_16_1 + i_16_2;

为什么?

------解决方案--------------------
你太浮躁了,其实答案在我6楼的补充说明里面已经写着了,就是怕你要这么问,提前写到,你却不仔细看。
你再回头看下6楼最后一句话“数据类型全部通过Int32或Int64形式存储”,你必须清楚,所有的.NET程序,最终都是被编译到IL语言执行的,所以必须从IL的执行原理解释。原先你的写法虽然是进行UInt16的加法,但是在IL里面,却是进行的Int32的加法,只不过将最终结果Int32再赋值给UInt16的变量而已,这个赋值就可能溢出,但是UInt32本身的加法,没有赋值产生溢出的可能性,只有加法运算过程的溢出,它只检测赋值溢出。
即使你不看IL,单单看C#,也会发现那两个UInt16的操作数相加后,返回的不是UInt16值,而是int32的值。从Int32转换到UInt16会溢出,但是从Int32转换到UInt32不存在溢出的可能性。