当我们在编写程序时,会发现有时候需要对不同类型的数据进行互相转换,之所以进行数据转换,是因为C#是在编译时静态类型化的,因此变量在声明后就无法再次声明,或者无法用语存储其他类型的值,除非该类型可以转换为变量的类型。
隐式转换
隐式转换:由于该转换时一种安全类型的转换,不会导致数据丢失,因此不需要任何特殊的语法。例如从较小整型到较大整型的的转换以及由派生类到基类的转换都是这样的转换。
隐式转换是有限制的,一般是低类型向高类型转换,能够保证值不发生变化,有个表格:
原数据类型 | 可隐式转换数据类型 |
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 |
long | float,double,decimal |
char | ushort,int,uint,long,ulong,float,double,decimal |
float | double |
ulong | float,double,decimal |
对于引用类型,隐式转换始终存在于一个类转换该类的任何一个直接或间接的基类或接口的情况,例如:
aClass a=new aClass();//定义一个对象
baseClass b=a;//隐式转换为基类的类型
显示转换
显示转换:显示转换需要强制性转换运算符。在该区域中,可能会丢失信息或不成功,典型的实例包括转换为具有较低精度或小的区域的类型和派生类到积累实力的转换。
显示转换又称强制性转换,是显示通知编译器打算进行转换且知道可能会发生数据丢失的一种数据转换方式。
double x=123.4;
int a;
a=(int )x;
以上程序在执行转换过程中,整型类型不支持的数据会被舍弃,经过转换后为123。
对于引用类型,如果需要从基类型转换为派生类型,则必须显示强制转换;引用类型之间的强制转换操作不会更改基础对象的运行时类型;它只更改用作对该对象的引用的值得类型。
一个比较完整值类型内包括隐式和显示的数据转换的例子:
static void Main(string[] args)
{
int num = 123;
long bigNum = num;
Console.WriteLine("num={0},bigNum={1}而这数据一样",num,bigNum);
double d = 123.4;
int dd = (int)d;
Console.WriteLine("d={0},dd={1}而这数据不一样",d,dd);
Console.ReadKey();
}