《C#编程入门与应用》—3.4.2 显式转换
3.4.2 显式转换
显式转换又称为强制转换。与隐式转换正好相反,显式转换需要用户明确指定转换的类 型,也就是说,显式转换需要强制转换运算符。显式转换可以发生在表达式的计算过程中, 它并不是总能成功,而且常常可能引起信息丢失,显式转换包括所有的隐式转换,也就是说, 把系统允许的任何隐式转换写成显式转换的形式都是允许的。
在转换中可能丢失信息时或在出于其他原因转换可能不成功时,必须进行强制转换。典 型的例子包括从数值到精度较低或范围较小的类型的转换和从基类实例到派生类的转换。拆 箱就是一种显式转换,显式转换通常包含显式数值转换、显式枚举转换和显式引用转换。
1.显式数值转换
显式数值转换用于通过显式转换表达式,将任何数字类型转换为任何其他数字类型。对 于它不存在隐式转换,常见的显式数值转换如下;
● 从 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 类型。
● 从 long 到 sbyte、byte、short、ushort、int、uint、ulong 或 char 类型。
● 从 ulong 到 sbyte、byte、short、ushort、int、uint、long 或 char 类型。
● 从 char 到 sbyte、byte 或 short 类型。
● 从 float 到 sbyte、byte、short、ushort、int、uint、long、ulong、char 或 decimal 类型。
● 从 double 到 sbyte、byte、short、ushort、int、uint、long、ulong、char、float 或 decimal 类型。
● 从 decimal 到 sbyte、byte、short、ushort、int、uint、long、ulong、char、float 或 double 类型。
显式数值转换有可能丢失信息或导致异常抛出,转换按照以下规则进行:
● 对于从一种整型到另一种整型的转换,编译器将针对转换进行溢出检测,如果没有发生溢出,则转换成功,否则抛出OverflowException 异常,这种检测还与编译器中是否设置 了 checked 选项有关。
● 对于从float、double 或 decimal 到整型的转换,将源变量的值舍入到最接近的整型值作为 转换的结果。如果这个整型值超出了目标类型的值域,则抛出 OverflowException 异常。
● 对于从float 或 double 到 decimal 的转换,源值将转换成小数形式并通过舍入取到小数点 后 28 位 ( 如果有必要的话)。如果源值太小,则结果为0;如果太大,以致不能用小数表 示,或是无穷和 NaN,则抛出 InvalidCastException 异常。
● 对于从decimal 到 float 或 double 的转换,小数的值通过舍入取最接近的值,这种转换可 能会丢失精度,但不会引起异常。
【例3-22】
创建控制台应用程序,在 Main() 方法中获取 Int64 的最大可能值并将值保存到 long 类型 的变量中,将 long 类型强制转换为 int 类型,并将最终的结果输出。代码如下:
编译执行上述代码,结果如下:
(int)9223372036854775807=-1
之所以出现上述的结果,是因为发生了溢出,从而在显式类型转换时导致信息丢失。
2.显式枚举转换
显式枚举转换实际上是枚举类型的元素类型与相应类型之间的隐式或显式转换。例如, 有一个元素类型为 int 的枚举类型 E,当执行从E 到 byte 的显式枚举转换时,实际上做的是 从 int 到 byte 的显式数值转换;当执行从byte 到 E 的显式枚举转换时,实际是执行byte 到 int 的隐式数值转换。
显式枚举转换包含以下内容:
● 从 sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double 或 decimal 到 任何枚举类型。
● 从任何枚举类型到sbyte、byte、short、ushort、int、uint、long、ulong、char、float、 double 或 decimal 类型。
● 从任何枚举类型到任何其他枚举类型。
【例3-23】
创建控制台应用程序,创建Weekday 枚举,枚举包含7 个值。在 Main() 方法中声明 Weekday 类型的变量 day,并将指定的数值强制转换为 Weekday 类型,转换后的结果赋予 day 变量。代码如下:
编译执行程序,输出结果如下;
Monday
3.显式引用转换
显式引用转换是那些需要运行时检查以确保它们正确的引用类型之间的转换。包括:
● 从对象类型 object 到任何其他引用类型。
● 从任何类类型 S 到任何类类型 T,其中 S 是 T 的基类。
● 从任何类类型 S 到任何接口类型 T,其中 S 不是密封类,而且没有实现 T。
● 从任何接口类型 S 到任何类类型 T,其中 T 不是密封类,而且没有实现 S。
● 从任何接口类型 S 到任何接口类型 T,其中 S 不是 T 的子接口。
● 从元素类型为SE 的数组类型S 到元素类型为TE 的数组类型T,这种转换需要满足以下 条件:
◆ S 和 T 只是元素类型不同,但是 S 和 T 具有相同的维数。
◆ SE 和 TE 都是引用类型。
◆ 存在从 SE 到 TE 的显式引用转换。
◆ 从 System.Array 以及它实现的接口到任何数组类型。
◆ 从 System.Delegate 以及它实现的接口到任何委托类型。
为了使显式引用转换在运行时成功,源操作数的值必须为 null,或源操作数所引用的对 象的实际类型必须是一个可通过隐式引用转换为目标类型的类型。如果显式引用转换失败, 则将引发 System.InvalidCastException 异常。
不论隐式还是显式引用转换,虽然可能会改变引用值的类型,但是不会改变值本身。
- 点赞
- 收藏
- 关注作者
评论(0)