C#允许进行两种不同数据类型的强制转换:隐式强制转换和显式强制转换。
将讨论这两种类型的强制转换。显式强制转换要在代码中显式地标记强制转换,应该在圆括号中写出目标数据类型:
int I= 3;
long 1= I;// implicitshort
s= (short)I; // explicit
对于预定义的数据类型,当类型强制转换可能失败或丢失某些数据时,需要显式强制转换。例如:
- 把int转换为short时,因为short可能不够大,不能包含对应int的数值。
- 把有符号的数据类型转换为无符号的数据类型时,如果有符号的变量包含一个负值,就会得到不正确的结果。
- 把浮点数转换为整数数据类型时,数字的小数部分会丢失。
- 把可空类型转换为非可空类型时, null值会导致异常。
此时应在代码中进行显式强制转换,告诉编译器你知道这会有丢失数据的危险,因此编写代码时要把这种可能性考虑在内。
C#允许定义自己的数据类型(结构和类),这意味着需要某些工具支持在自定义的数据类型之间进行类型强制转换。方法是把类型强制转换运算符定义为相关类的一个成员运算符,类型强制转换运算符必须标记为隐式或显式,以说明希望如何使用它。我们应遵循与预定义的类型强制转换相同的规则,如果知道无论在源变量中存储什么值,类型强制转换总是安全的,就可以把它定义为隐式强制转换。然而,如果某些数值可能会出错,如丢失数据或抛出异常,就应把数据类型转换定义为显式强制转换。
定义类型强制转换的语法类似于本章前面介绍的重载运算符。这并不是偶然的,类型强制转换在某种情况下可以看作是一种运算符,其作用是从源类型转换为目标类型。为了说明这种语法,下面的代码是从本节后面介绍的结构Currency示例中节选的:
public static implicit operator float (Currency value)
{
//processing
}
运算符的返回类型定义了类型强制转换操作的目标类型,它有一个参数,即要转换的源对象。这里定义的类型强制转换可以隐式地把Currency型的值转换为float型。注意,如果数据类型转换声明为隐式,编译器就可以隐式或显式地使用这个转换。如果数据类型转换声明为显式,编译器就只能显式地使用它。与其他运算符重载一样,类型强制转换必须同时声明为public和static.