http://book.2cto.com/201210/6832.html
类型转换就是将一种类型转换成另一种类型。转换可以是隐式转换或者显式转换,本节将详细介绍这两种转换方式,并讲解有关装箱和拆箱的内容。
1. 隐式转换
所谓隐式转换就是不需要声明就能进行的转换。进行隐式转换时,编译器不需要进行检查就能安全地进行转换。表3.4列出了可以进行隐式转换的数据类型。
表3.4 隐式类型转换表
源 类 型 目标类型
sbyte short、int、long、float、double、decimal
byte short、ushort、int、uint、long、ulong、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
char ushort、int、uint、long、ulong、float、double或decimal
float double
ulong float、double或decimal
long float、double或decimal
从int、uint、long或ulong到float,以及从long或ulong到double的转换可能导致精度损失,但是不会影响其数量级。其他的隐式转换不会丢失任何信息。
说明:对于不同值类型之间的转换,如果从低精度、小范围的数据类型转换为高精度、大范围是数据类型,可以使用隐式转换。
【例3.8】将int类型的值隐式转换成long类型,代码如下。
01 int i=2011; //定义整形变量并初始化
02 long l=1; //定义长整形变量并初始化
03 l=i; //隐式转换
2. 显式转换
显式转换也可以称为强制转换,需要在代码中明确地声明要转换的类型。如果要在不存在隐式转换的类型之间进行转换,就需要使用显式转换。表3.5列出了需要进行显式转换的数据类型。
表3.5 显式类型转换表
源 类 型 目标类型
sbyte byte、ushort、uint、ulong或char
byte sbyte和char
short sbyte、byte、ushort、uint、ulong或char
ushort sbyte、byte、short或char
int sbyte、byte、short、ushort、uint、ulong或char
(续)
源 类 型 目标类型
uint sbyte、byte、short、ushort、int或char
char sbyte、byte或short
float sbyte、byte、short、ushort、int、uint、long、ulong、char或decimal
ulong sbyte、byte、short、ushort、int、uint、long或char
long sbyte、byte、short、ushort、int、uint、ulong或char
double sbyte、byte、short、ushort、int、uint、ulong、long、char或decimal
decimal sbyte、byte、short、ushort、int、uint、ulong、long、char或double
由于显式转换包括所有隐式转换和显式转换,因此总是可以使用强制转换表达式从任何数值类型转换为任何其他的数值类型。
【例3.9】创建一个控制台应用程序,将double类型的x进行显式类型转换,代码如下。
01 static void Main(string[] args)
02 {
03 double x = 19810927.0112; //建立double类型变量x
04 int y = (int)x; //显示转换成整型变量y
05 Console.WriteLine(y); //输出整型变量y
06 Console.ReadLine();
07 }
程序运行结果为19810927。
也可以通过Convert关键字进行显式类型转换,上述例子还可以通过下面代码实现。
【例3.10】创建一个控制台应用程序,通过Convert关键字进行显式类型转换,代码如下。
01 double x = 19810927.0112; //建立double类型变量x
02 int y = Convert.ToInt32(x); //通过Convert关键字转换
03 Console.WriteLine(y); //输出整型变量y
3. 装箱和拆箱
将值类型转换为引用类型的过程叫做装箱,相反,将引用类型转换为值类型的过程叫做拆箱,下面将通过例子详细介绍装箱与拆箱的过程。
(1)装箱
装箱允许将值类型隐式转换成引用类型,下面通过一个实例演示如何进行装箱操作。
【例3.11】创建一个控制台应用程序,声明一个整型变量i并赋值为2011,然后将其赋值到装箱对象obj中,最后再改变变量i的值,代码如下。(实例位置:光盘\mr\example\第3章\3.11)
代码位置:光盘\mr\example\第3章\3.11\Test06\Test06\Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test06
{
class Program
{
static void Main(string[] args)
{
int i = 2011; //声明一个int类型变量i,并初始化为2011
object obj = i; //声明一个object类型obj,其初始化值为i
Console.WriteLine("1、i的值为{0},装箱之后的对象为{1}", i, obj);
i = 927; //重新将I赋值为927
Console.WriteLine("2、i的值为{0},装箱之后的对象为{1}", i, obj);
Console.ReadLine();
}
}
}
运行结果如图3.6所示。
从程序运行结果可以看出,值类型变量的值复制到装箱得到的对象中,装箱后改变值类型变量的值,并不会影响装箱对象的值。
(2)拆箱
拆箱允许将引用类型显式转换为值类型,下面通过一个示例演示拆箱的过程。
【例3.12】创建一个控制台应用程序,声明一个整型变量i并赋值为2011然后将其复制到装箱对象obj中,最后,进行拆箱操作将装箱对象obj赋值给整型变量j,代码如下。(实例位置:光盘\mr\example\第3章\3.12)
代码位置:光盘\mr\example\第3章\3.12\Test07\Test07\Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test07
{
class Program
{
static void Main(string[] args)
{
int i = 2011; //声明一个int类型的变量i,并初始化为2011
object obj = i; //执行装箱操作
Console.WriteLine("装箱操作:值为{0},装箱之后对象为{1}", i, obj);
int j = (int)obj; //执行拆箱操作
Console.WriteLine("拆箱操作:装箱对象为{0},值为{1}", obj, j);
Console.ReadLine();
}
}
}
运行结果如图3.7所示。
说明:装箱是将一个值类型转换为一个对象类型(object),而拆箱则是将一个对象类型显式转换为一个值类型。对于装箱而言,它是将被装箱的值类型复制一个副本来转换,而对于拆箱而言,需要注意类型的兼容性,例如,不能将一个值为string的object类型转换为int类型。
试一试:修改上面的实例,在“int j = (int)obj;”语句的上一行添加“i=927;”这条语句,然后再输出相关变量的值。