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

C#支持隐式类型转换。意思是如果我们试图给变量x赋予变量y的值:

x = y;

且这两个变量被声明为不同类型,则C#仍将尝试赋值操作,自动把y的类型转换为x的数据类型,前提是不能损失数据精度。(C#CC++不同的是,后两者即便损失精度也会做自动转换)。举例说明:

  int x;

  double y;

  y = 2.7;

  x = y; // 试图将double值赋给int变量

          // 只在CC++中有效,C#不支持。

这段代码中,我们试图把y的双精度值2.7复制给x,而x是一个整类型变量。假使赋值操作真被执行,则y值的小数部分将被截去,x得到值2。这样就发生了精度损失,或称窄化转换(narrowing conversion)CC++编译器允许这样的赋值,不出一声就把值截;然而,C#编译器不会认为这是我们的真意,而是在最末行产生一个错误。

  error CS0029: Cannot implicitly convertdoubleto typeint

为了明确告诉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类型。

你将在本书稍后部分看到其他和对象相关的转换。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值