2.1 显式转换和隐式转换
从直观上看,显式和隐式转换只是语法上面的差别。当发生类型转换时,如果在代码中明确指定了目标类型,则称为显式转换,否则则称为隐式转换。
C#通过将形如“(目标类型)”这样的语法构造放在待转换对象的前面,来表示一个显式转换。
下面的代码介绍了在C#语言中进行显式和隐式转换时的语法。
需要注意的是,不是任意两种类型之间都能随意进行转换的。另外,无论显式转换还是隐式转换,都可能会失败。1int x = 10; 2long y = x; // 隐式转换 3x = (int) long; // 显示转换 4
如果显式转换失败,会在运行时抛出异常(这个异常可能是InvalidCastException,也可能是InvalidOperationException、OverflowException等具体异常);如果隐式转换失败,则会在编译时得到一个错误,指出不能进行隐式转换。
最后,隐式转换也可以用显式转换替代,但显式转换不能用隐式转换替代。换句话说,可以用显式转换的地方,用隐式转换也没什么问题;但需要显式转换的地方,就一定不能用隐式转换。
下面将从另外一种角度介绍各种不同的类型转换。
2.2 变换、投射、装箱/拆箱
根据参与类型转换的两种类型(源类型和目标类型)的关系不同,可以将类型转换分成三种;即:
如果源类型和目标类型一个是值类型一个是引用类型,则称为装箱/拆箱;
如果源类型和目标类型之间存在着直接或间接继承,则称为投射;
如果源类型和目标类型不具备上述两种关系,如两种简单值类型或兄弟/邻居类型(有着共同的祖先类)之间,则称为普通类型转换(或称“变换”)。
变换
变换是最普通的一种类型转换,通常发生在:
简单(内置)值类型之间;
重载了类型转换运算符的类型之间;
简单值类型就是int、long、float、double等类型。在这些类型之间转换的时候,如果不会发生精度损失,则可以使用隐式转换,否则必须使用显式转换。换言之,从较短的类型向较长的类型转换,可以用隐式转换;从较长的向较短的转换,必须用显式转换(“长短”指的是:int长4字节,long长8字节,所以int比long短。)