隐式转换

  隐式转换不需要做任何工作,也不需要另外编写代码。考虑下面的代码:

  1. var1 = var2;

  如果 var2 的类型可以隐式地转换为 var1 的类型,这个赋值语句就涉及一个隐式转换。这两个变量的类型也可能相同,此时就不需要隐式转换。例如,ushortchar 的值是可以互换的,因为它们都可以存储 0~65535 之间的数字,在这两个类型之间可以进行隐式转换,如下面的代码所示:

  1. ushort destinationVar;
  2. char sourceVar = 'a';
  3. destinationVar = sourceVar;
  4. Console.WrileLine("sourceVar val: {0}", sourceVar);
  5. Console.WriteLine("destinationVar val: {0}", destinationVar);

  这里存储在 sourceVar 中的值放在 destinationVar 中。在用两个 Console.WriteLine( ) 命令输出变量时,得到如下结果:

  1. sourceVar val : a
  2. destinationVar val : 97

  即使两个变量存储的信息相同,使用不同的类型解释它们时,方式也是不同的。

  简单类型有许多隐式转换:boolstring 没有隐式转换,但数值类型有一些隐式转换。表 5-1 列出了编译器可以隐式执行的数值转换(记住,char 存储的是数值,所以 char 被当作一个数值类型)。

表5-1 隐式数值转换

类型可以安全地转换为
byteshort,ushort,int,uint,long,ulong,float,double,decimal
sbyteshort,int,long,float,double,decimal
shortint,long,float,double,decimal
ushortint,uint,long,ulong,float,double,decimal
intlong,float,double,decimal
uintlong,ulong,float,double,decimal
longfloat,double,decimal
ulongfloat,double,decimal
floatdouble
charushort,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,就应能转换这个值吗?答案是可以。具体地说,虽然可以,但必须使用显式。执行显式转换有点类似于 “我已经知道你对我这么做提出了警告,但我将对其后果负责”。