隐式转换:从类型A到类型B的转换可在所有情况下进行,执行转换的规则非常简单,可以让编译器执行转换。
显式转换:从类型A到类型B的转换只能在某些情况下进行,转换规则比较复杂,应进行某种类型的额外处理。
一、隐式转换
隐式转换不需要做任何工作,也不需要另外编写代码。
var1 = var2
bool 和 string 没有隐式转换。
隐式数值转换
类型 | 可以安全地转换为 |
---|---|
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 |
如果发生显式转换,那么编译器会警告。
二、显式转换
明确要求编译器把数值从一种数据类型转为另一种数据类型。
(<destinationType>)<sourceVar>
将 <sourceVar> 中的值转换为 <destinationType> 类型
可以为表达式设置溢出检查,关键词—— checked 和 unchecked 。
checked(<expression>)
unchecked(<expression>)
使用检查溢出时,如果表达式中的显式转换造成了数据溢出,编译器会报错。
也可以通过修改属性来设置是否检查溢出的选项:Check for arithmetic overflow/unoverflow ,它会影响程序的执行速度,因此不需要时应禁用它。
三、使用Convert进行显式转换
它们总是会进行溢出检查,checked 和 unchecked 关键字以及项目属性设置不起作用。