继续昨天的数据类型转换,今天继续学习显式转换;很清楚显式转换就是和隐式转换相反的转换呗(ps:这是字面上的意思了,其实这种说法不准确了,没有什么相反不相反的说法了),不多说了,继续学习~~
显式转换:各种类型的转换属于显式转换的也挺多的;下面各种类型转换属于显式转换
所有隐式转换(这一点我也不是很清楚,还待继续学习);显式数值转换;显式枚举转换;显式引用转换;解包转换(unboxing);用户自定义显式转换。
一、显式数值转换:指的是那些从一种数字类型到另外一种数字类型之间不能通过隐式类型转换实现的转换(很简单的记住法就是从范围大的向范围小的转换,前提不要超过转换后数据值得最大范围,否则会抛异常)包括如下类型:
从sbyte到byte,ushort,uint,ulong或char类型的转换;
从byte到sbyte和char类型的转换;
从short到sbyte,byteushort,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,shortushort,int,uint,long,ulong,char,float或double类型的转换;
显式数值转换有可能造成自身信息损失或者异常。一个显式的数值转换是通过下述方式进行的:
在检测完成的程序段,如果源操作数未超出目标类型数据的取值范围,转换可以顺利完成;但是如果源操作数超出目标类型数据的取值范围,转换将生成一个溢出异常,在未完成检测的程序段,转换总是可以顺利完成,但是源操作数的最高位会被略去;
对于从float,double或decimal类型到整型的转换,源操作数是接近0的整数,此值就是转换的结果。假如转换得到的整数超出目标类型允许的数值范围,转换将产生一个溢出异常;
对于从双精度到浮点数类型的转换,此双精度数值会逼近最为接近的浮点数数值。假如此双精度数太小无法使用浮点数表示,那么转换的结果将是0+或0-。假如此双精度数太大无法使用浮点数表示,那么转换结果将是-¥或+¥。假如此双精度数为NaN,那么转换的结果也是NaN;
对于从浮点数或双精度到十进制类型的转换,源操作数会被转换成相应的十进制数,而当此十进制数达到或超过28位长时,转换结果将是数值最接近的某一个十进制数。假如此源操作数太小无法用十进制数表示时,转换的结果将时0。当源操作数位NaN,¥或者超出十进制数的表示范围时,转换将产生一个InvalidCast异常;
对于从十进制数到浮点数或双精度类型的转换,此十进制数会被转换为数值上最接近的浮点数或双精度数。虽然此转换会损失精度,但并不会造成异常。
(ps:以上是微软官方说明,其实也没必要去记住这些了,这些概念知道就好,以后做久了自然就明白了)
二、显式枚举类型转换
从sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double或十进制到任意枚举类型的转换;
从任意枚举类型到sbyte,byte,short,ushort,int,uint,logn,ulong,char,floart,double或十进制类型的转换;
从某一种枚举类型到另外一种枚举类型的转换;
显式枚举类型转换是通过把源枚举类型看作此类型的原始类型,之后进行相应类型之间的显式或隐式类型转换。例如, 如果有一个枚举类型E且原始类型为int,那么从E到byte的转换将被作为一个显示的从int到byte的数字转换处理,而从byte到的E转换将被作为一个显示的从byte到int的数字转换处理。
三、显式引用类型转换
从对象(object)到任意引用类型之间的转换
从任意类类型S到任意类类型T之间的转换,其中S是T的基类
从任意类类型 S到任意类类型T之间的转换,其中S没有被封装,并且S没有实现T
从任意接口类型 S到任意类类型T之间的转换,其中T没有被封装,并且T没有实现S;
从任意接口类型S到任意接口类型之间的转换,其中S不是从T派生的
从任意具有元素SE 的数组类型S到任意具有元素 TE的数组类型T之间的转换,只有满足下列条件才能进行:
S和T只在数字元素类型上存在不同。换句话说,S和T维数相同。
不论SE或T E都必须为引用类型。
从S E或T E之间的转换为显式引用转换从System.Array到任意数组类型之间的转换;
从System.Delegate到任意代表类型之间的转换;
从System.Icloneable到任意数组类型或者代表类型之间的转换;
显式引用转换需要实时检测保证其正确进行的引用类型之间的转换。
对于一个null类型或由源变量引用的实际的对象类型,必须是能够被隐式的引用转换来转换为目标类型的类型;假如显式引用转换失败,转换会生成一个InvalidCast异常。
引用转换,无论是显式的或隐式的,并不改变被转换对象的引用一致性。换句话说,当一个引用转换改变数值的类型时,并未改变数值本身。
五、解包转换
解包转换允许从类型对象到任意数值类型,或者从任意接口类型到任意实现该接口类型的数值类型间的转换。解包操作包括首先检测对象实例为给定数值类型包装的数值,之后从那个实例中复制出数值。
六、用户自定义显式转换
用户自定义显式转换包括可选的标准显式转换,紧随其后的是一个用户自定义的显式转换运算符,之后是另一个可选的标准显式转换
七、标准转换
标准转换指那些可以在用户自定义转换中出现的预定义的转换