上面已经说到,隐式转换就是不需要什么语法申明,例如:
byte bt = 1;
short s = 35;
int x = bt; //将byte类型直接交给int类型,这就是一次隐式转换
int y = s; //同上
转换有一个前提,那就是只要能保证值不会发生任何变化,类型转换就可以成功进行。但是,在转换之前编译器会判断一次,这个判断是不管值是否能够保证的。编译器只看类型的大小。所以隐式转换的前提是,位数小的类型向大的转换,且能够保证值不发生变化就可以自动转换。
上面两个实例你应该看出来了,都是扩大转换。比如下面实例,将int类型的转换为byte类型这样的缩小转换,要想也隐式实现就会出错,因为int类型比byte类型大,这就有可能导致数据丢失。所以编译器会提示错误,如下例,我们先申明一个int类型的变量,然后试图将这个int类型的变量隐式转换为byte类型。如图2-20
图 2-20
下表显示了预定义的隐式数值转换。隐式转换可能在多种情形下发生,包括调用方法时和在赋值语句中。
隐式转换需要注意以下几点:
可空类型隐式转换为其它可空类型,应遵循表上表非可空类型的转换规则。即int? 隐式转换为long?、float?、double?和decimal?。
非可空类型隐式转换为可空类型也遵循表上表中的转换规则,即int隐式转换为long?、float?、double?和decimal?。
可空类型不能隐式转换为非可空类型,此时必须进行显式转换,如下一节所述。这是因为可空类型的值可以是null,但非可空类型不能表示这个值。
从 int、uint 或 long 到 float 的转换以及从 long 到 double 的转换的精度可能会降低,但数值大小不受影响。
不存在到 char 类型的隐式转换。
不存在浮点型与 decimal 类型之间的隐式转换。
int 类型的常数表达式可转换为 sbyte、byte、short、ushort、uint 或 ulong,前提是常数表达式的值处于目标类型的范围之内。
另外,以下场合不适合隐式转换:
●int转换为short--会丢失数据
●int转换为uint--会丢失数据
●uint转换为int--会丢失数据
●float转换为int--会丢失小数点后面的所有数据
●任何数字类型转换为char --会丢失数据
●decimal转换为任何数字类型--因为decimal 类型的内部结构不同于整数和浮点数
●int? 转换为int--可空类型的值可以是null
这些如果一定要转换,就需要使用显示转换来强迫编译器进行转换了。
本文为天轰穿原著,转载请注明出处及作者!