在C#中类型转换的机制分为两种:
・隐式转换(Implicit Conversions)
・显示转换(Explicit Conversions)
隐式转换不需要指明欲转变的目的类型;而现显示转换明确地使用转换运算符(cast)指定要转换成哪一种类型。
下面我们用程序来讲解程序的转换:
好,现在我们反过来把b赋给a看看会出现什么情况:

我们看,现在呢提示无法将类型“long”隐式转换为“int”。存在一个显示转换(是否缺少强制转化?)。也就是说上面的代码编译通不过,为什么会这样呢?我们做一下实验:
我们看,long所能存贮的最大的整数值会比int大的很多,毕竟它是用64个位也就是8个字节存储一个整数,所以呢它所能存储的整数范围会大很多。
而刚才我们的代码把一个范围大的值赋给一个范围小的值int,这时候就有可能造成数据的丢失,所以编译通不过。这时候该怎么办呢?正如刚才我们所讲需要使用显示转换。
- a=(int)b; //显示转换
- //显示转化就是在预转化对象b的前面加上括号,要把b转化的类型填入括号中就可以了。显示转换也叫强制转换。
编制执行,没有出错。接下来,我们继续做实验,刚才我们通过代码了解,int的最大值是2147483647,一个10位2开头的数,下面我们把long整型b初期值赋一个11位的数,看看a=(int)b;显示转换会有什么后果:
看看执行是否会出错?如图:
从代码中我们知道b的值明显已经超过了a的承受范围,但是呢现在还是把b赋给了a会发生什么样的后果呢?它并没有报错,但发生了溢出,我们看a的值现在和b的值风牛马不相及,相差非常的远。在程序中,出现这样的错误是非常致命的。但是出现这样的错误,C#并没有发出警告或者发出异常,我们该怎么办呢?
C#允许编程人员自己处理溢出,checked和unchecked操作符提供了这种灵活性。我们可以利用它们来决定对溢出是否进行检查。
・ checked
・ unchecked
・ checked语句
・ unchecked语句
checked和unchecked是放在表达式前面的,只能作用于一条语句。而如果想作用于多条语句就可以使用checked语句和uncheked语句。好,我们来改写刚才的代码:
好,保存代码执行代码,由于发生了溢出操作,程序报错。如图:
通过checked操作符的使用,我们就可以捕捉到那些溢出的异常了,我们呢必须要对这些异常做处理,捕捉它。
这样,我们编译执行代码后就能捕捉到这个异常并能做相应的处理了。好,我们来看看checked语句的用法:
下面,我们来谈一下Checked和unchecked的使用准则:
・ 写代码时,将有可能发生非预期溢出的的代码放到一个checked块中。
也就是说,如果你感觉到这个地方有可能发生溢出,这个时候你就必须把代码放在checked块中。
・ 写代码时,将允许发生溢出的代码显示地放到一个unchecked块中。
也就是说,如果某个地方你允许它发生溢出,这个时候你必须要把代码放在unchecked块中,告诉其他程序员:这个地方是可以发生溢出的。
好,我们继续写程序。现在我们用byte来举例子,我们先来看Byte的最大值是多少:
我们看,Byte的最大值是255,Byte是一个无符号的8位整数。它的取值范围是0~255,这里有一个很有意思的现象,我们来看一下:
我们执行编译代码,看看b的值是否是200。如图:
这时候提醒无法将类型“int”隐式转换为“byte”。这是为什么呢?这是因为在执行算数运算时,比如现在b = b + 100;的加法运算,第一步要求所有操作数都扩展为32位值或者64位值,当你的任何操作数超过32位的时候,这时候才会扩展为64位值。也就是说,这个地方100已经转换为一个32位的整数,这时候把它赋给一个Byte类型的b,自然就不行了。这时候就有必要对其进行显示的转换:
这样就没有问题了。当然我们也可以用另外一种方法,有意思的地方也就在这里:
保存代码编译,我们看程序并没有报错,但是b = b + 100;却报错。这个大家也没有必要去深究,知道有这么回事就行了,当然像这种地方很容易出现溢出的地方都需要加上checked块。
好,这节课的内容先讲到这里。
由快乐乔巴听课摘写笔记