C#中有两种类型的类型转换,隐式类型转换和显式类型转换。
隐式转换是系统默认的,不需要加以声明就可以进行的转化,不会造成数据丢失
显式转换即强制类型转换,可能会造成数据的丢失
显式转换包括所有的隐式转换(即把任何系统允许的隐式转化写成显式转换都是允许的)
1 隐式类型转换
1.1 隐式数值转换
实际上就是低精度的数值类型向高精度的数值类型转换。特殊的,不存在char类型的隐式转换,这意味着其他整型值不能自动转换为char类型
1.2 隐式枚举转换
隐式枚举转换允许将十进制的整数0抓换为任意枚举类型
1.3 隐式引用转换
包括:
1)任何引用类型 → object类型
2)子类类型 → 父类类型
3)类类型s → 接口类型t ,其中类s实现了接口t
4)接口类型s → 接口类型t , 其中t是s的父接口
5)满足一定条件下的 , 数组类型t → 数组类型s
2 显式类型转换
需要用户明确指定转换的类型。不总是能够成功,常常引起数据丢失和异常。
2.1 显式数值转换
包括:
1)一种整型 → 另一种整型。编译器将针对转换进行溢出检测,如果没有发生溢出,则转换成功,否则抛出一个OverflowException异常。这种检测还与编译器中是否设定了checked选项有关。
2)float / double /decimal → 整型。舍入到最接近的整型作为转换的结果。如果这个整型值超出了目标类型的值域,则抛出一个OverflowException异常。
3)double → float。double值通过舍入取最接近的float值。如果这个值太小,结果将变成正0或负0,如果这个值太大,将变成正无穷或负无穷。如果原double值是Nan,则转换结果也是Nan。
4)float / double → decimal。原值将转换成小数形式并通过舍入取到小数点后28位(如果有必要的话)。如果原值太小,则结果为0,如果太大以致不能用小数表示,或是无穷和Nan,则抛出InvalidCastException异常。
5)decimal → float / double。小数的值通过舍入取最近的值。这种转换可能会丢失精度,但不会引起异常。
2.2 显式枚举转换
实际上是枚举类型的元素类型与相应类型之间的隐式或显式转换
2.3 显式引用转换
显示引用转换发生在引用类型之间,需要在运行时检测以确保正确。
为了确保显示引用转换的正常执行,要求原变量必须是null或者它所引用的对象的类型可以被隐式引用转换为目标类型。否则显式引用转换失败,将抛出一个InvalidCastException异常
包括:
1)object → 任意引用类型
2)类类型S → 类类型T,其中s是T的父类
3)基类型S → 接口类型T,其中S不是密封类,而且没有实现T
4)接口类型S → 类类型T,其中T不是密闭类,而且没有实现S
5)接口类型S → 接口类型T,其中S不是T的子接口
6)满足一定条件下的 , 数组类型S → 数组类型T
显示转换的方法:
1.b = (Type) a;
2.Convert类下To开头的静态方法,e.g. Convert.ToInt16(a)//a为null时返回0
3.基本数字类型和字符串间的转换:
a)static Single Parse(string s) //s为null时抛出异常
b)static bool TryParse(string s , out Single result) //s为null时返回false,reslut=0