显式转换和强制转换
如果要把短类型转换为长类型,让长类型保存短类型的所有位很简单。然而,在其他情况下,
目标类型也许无法在不损失数据的情况下容纳源值。
例如,假设我们希望把ushort值转化为byte。
- ushort可以保存任何0~65535的值。
- byte只能保存0一255的值。
- 只要希望转换的ushort值小于256,就不会损失数据。然而,如果大于256,最高位的数
据将会丢失。
例如,图17-5演示了尝试把值为1365的ushort类型转换为byte类型会导致数据丢失。不
是源值的所有最高位都适合目标类型,这会导致溢出或数据丢失。源值是1365,而目标的最大
值只能是255。最终字节中的结果值为85,而不是1365。
很明显,在所有可能的无符号16位ushort值中,只有相当小一部分(0.4%)能在不损失
数据的情况下安全转换为无符号8位byte类型。其他值会导致数据溢出(overflow),产生其
他值。
强制转换
对于预定义的类型,C#会自动将一个数据类型转换为另一个数据类型,但只是针对那些从源
类型转换为目标类型时不会发生数据丢失的情况。也就是说,如果源类型的任意值在被转换成目
标类型时会丢失值,那么C#是不会提供这两种类型的自动转换的。如果希望对这样的类型进行
转换,就必须使用显式转换。这叫作强制转换表达式。
如下代码给出了一个强制转换表达式的示例。它把varl的值转换为sbyte类型。强制转换
表达式的构成如下所示。
- 一对圆括号,里面是目标类型。
- 圆括号后是源表达式。
如果我们使用强制转换表达式,就意味着要承担执行操作可能引起的丢失数据的后果。这就
好比我们说:“不管是否会发生数据丢失,我知道在做什么,进行转换吧。"(这时你一定要真正
清楚自己在做什么。)
例如,图17-6演示了强制转换表达式将两个ushort类型的值转换为byte类型。对于第一种
情况,没有数据丢失。对于第二种情况,最高位丢失了,得到的值是85,很明显不等于源值1365。