您的位置:首页 > 移动开发 > Objective-C

Beginning C# Objects从概念到代码——1.10 隐式类型转换和显式类型转换

2006-12-11 12:58 393 查看
C#支持隐式类型转换。意思是如果我们试图给变量x赋予变量y的值:

x = y;
且这两个变量被声明为不同类型,则C#仍将尝试赋值操作,自动把y的类型转换为x的数据类型,前提是不能损失数据精度。(C#与C和C++不同的是,后两者即便损失精度也会做自动转换)。举例说明:
int x;
double y;
y = 2.7;
x = y; // 试图将double值赋给int变量
// 只在C和C++中有效,C#不支持。
这段代码中,我们试图把y的双精度值2.7复制给x,而x是一个整类型变量。假使赋值操作真被执行,则y值的小数部分将被截去,x得到值2。这样就发生了精度损失,或称窄化转换(narrowing conversion)。C或C++编译器允许这样的赋值,不出一声就把值截;然而,C#编译器不会认为这是我们的真意,而是在最末行产生一个错误。

error CS0029: Cannot implicitly convert‘double’to type‘int’
为了明确告诉C#编译器我们愿意接受精度损失,必须进行显式转换,把表达式值转换为括号里的目标类型。

换言之,我们需要重写上例的末行,让C#编译器接受它:

int x;
double y;
y = 2.7;
x = (int) y; // 能够编译。C#编译器“松了口气”。
// 因为我们明确地告诉它,
// 想要进行窄化转换。
当然,如果我们进行反向赋值:

int x;
double y;
x = 2;
y = x; // 把int值赋给double变量;
//y的值将是2.0
C#编译器不会对末行产生问题,因为在该个案里,我们把较低精度的值——2——赋予了拥有较高精度的变量。这称作宽化转换(widening conversion);这类转换在C#中会自动进行,无需显式转换。
注意,在C#里面给float变量赋值时,有一种特殊情况;语句
float y = 3.5; // 不会被编译!
将产生一个编译器错误,因为类似3.5这样带有小数部分的数字常量会被C#认为是拥有更高精度的double值,所以编译器将因精度损失而拒绝执行。要进行这样的赋值,必须显式地把浮点常量转换为float值:
float y = (float) 3.5; // 没问题;进行了转换。
或者,也可以使用后缀F,强制编译器把赋值语句右边的常量看作浮点值:
float y = 3.5F; // 可以,我们指示了该常量
// 应被当作浮点值处理。
还有一种选择是直接使用double变量而不用float变量来表示浮点数。在SRS应用中,无论何时要声明浮点变量,我们都会使用double来代替,这样可以避免类型转换操作。
仅有一种C#简单类型不可转换到另一类型,无论显式或隐式都不行,那就是bool类型。
你将在本书稍后部分看到其他和对象相关的转换。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: