隐式转换
隐式转换不需要做任何工作,也不需要另外编写代码。考虑下面的代码:
var1 = var2;
如果 var2
的类型可以隐式地转换为 var1
的类型,这个赋值语句就涉及一个隐式转换。这两个变量的类型也可能相同,此时就不需要隐式转换。例如,ushort
和 char
的值是可以互换的,因为它们都可以存储 0~65535 之间的数字,在这两个类型之间可以进行隐式转换,如下面的代码所示:
ushort destinationVar;
char sourceVar = 'a';
destinationVar = sourceVar;
Console.WrileLine("sourceVar val: {0}", sourceVar);
Console.WriteLine("destinationVar val: {0}", destinationVar);
这里存储在 sourceVar
中的值放在 destinationVar
中。在用两个 Console.WriteLine( )
命令输出变量时,得到如下结果:
sourceVar val : a
destinationVar val : 97
即使两个变量存储的信息相同,使用不同的类型解释它们时,方式也是不同的。
简单类型有许多隐式转换:bool
和 string
没有隐式转换,但数值类型有一些隐式转换。表 5-1
列出了编译器可以隐式执行的数值转换(记住,char
存储的是数值,所以 char
被当作一个数值类型)。
表5-1 隐式数值转换
类型 | 可以安全地转换为 |
---|---|
byte | short,ushort,int,uint,long,ulong,float,double,decimal |
sbyte | short,int,long,float,double,decimal |
short | int,long,float,double,decimal |
ushort | int,uint,long,ulong,float,double,decimal |
int | long,float,double,decimal |
uint | long,ulong,float,double,decimal |
long | float,double,decimal |
ulong | float,double,decimal |
float | double |
char | ushort,int,uint,long,ulong,float,double,decimal |
不要担心—不需要记住这个表格,因为很容易看出编译器可以执行哪些隐式转换。第3章中表3-6
列出了每种简单数学类型的取值范围。这些类型的隐式转换规则是:任何类型 A,只要其取值范围完全包含在类型 B 的取值范围内,就可以隐式转换为类型 B。
其原因是很简单的。如果要把一个值放在变量中,而该值超出了变量的取值范围,就会出问题。例如,short
类型的变量可以存储 0~32767 的数字,而 byte
可以存储的最大值是 255,所以如果要把一个 short
值转换为 byte
值,就会出问题。如果 short
包含的值在 256~32767 之间,相应数值就不能放在 byte
中。
但是,如果 short
类型变量中的值小于 255,就应能转换这个值吗?答案是可以。具体地说,虽然可以,但必须使用显式。执行显式转换有点类似于 “我已经知道你对我这么做提出了警告,但我将对其后果负责”。