在C#中,将一种数据类型的值转换成另一种数据类型的过程称为类型转换。一共分为两种,分别是隐式类型转换和显示类型转换。
显示类型转换又称为强制类型转换。
什么是隐式类型转换?指将一个较小范围的数据类型转换为较大范围的数据类型时,编译器会自动完成类型转换,这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失。
举个例子,肯德基的咖啡分为小杯和大杯两种,这就是两种不同的数据类型,代表量程不同。就算将整个小杯里面的咖啡倒进大杯里,也丝毫没有压力,不会导致咖啡溢出,因为大杯的容量大呀。所以这种操作就是安全的,在计算机里面,这样的操作就是隐式转换。
反过来,将大杯里的咖啡全部倒进小杯里呢?不一定是安全的。如果大杯里只装了一点点咖啡,小杯可能装得下,如果装得多呢,可能会杯满则溢。所以这样的操作是不安全的,如果硬要这样做,那就只能是强制转换了。
理解这一点后,我们分别以byte、short和int为例。因为byte的范围是0-255,而short的范围是-32768到+32767之间,int的范围是-2147483648到2147483647之间。很明显,byte就是小杯,short就是中杯,int就是大杯。
byte small = 255;
short medium = small;
int large = medium;
Console.WriteLine($"small = {small}");
Console.WriteLine($"medium = {medium}");
Console.WriteLine($"large = {large}");
输出结果
small = 255
medium = 255
large = 255
结果分析
我们声明并初始化了一个small变量,变量的值为255,然后声明了short型的medium 变量和int型的large 变量,将small的值赋值给medium,将medium的值赋值给large,编译器都没作任何提示。但实则发生了隐式类型转换,就是将byte型隐式转换成了short型,将short型隐式转换成了int型。
再观察下面的例子
这时我们反过来,先定义一个int型的变量large,然后定义short型的变量medium,并将large的值赋值给medium时,编译器会提出警示:无法将类型"int”隐式转换为"short"。存在一个显示转换(是否缺少强制转换)。
那么显示转换该怎样实现呢?在需要强制转换的变量前面添加转换后的目标数据类型,用小括号即可。
int large = 255;
short medium = (short)large;
byte small = (byte)medium;
Console.WriteLine($"large = {large}");
Console.WriteLine($"medium = {medium}");
Console.WriteLine($"small = {small}");
输出结果
large = 255
medium = 255
small = 255
强制转换的缺点,就是数据可能损失精度。观察下面的例子
double d = 456.789;
int i;
i = (int)d;// 强制转换 double 为 int
Console.WriteLine($"d = {d}");
Console.WriteLine($"i = {i}");
输出结果
d = 456.789
i = 456
纵然456.789符合四舍五入法则,发生强制转换后,结果并不是457,而是456。直接将小数点砍掉,保留整数变成int型。
当前课程源码下载:(注明:本站所有源代码请按标题搜索)
文件名:041-隐式数据转换与显示数据转换
链接:https://pan.baidu.com/s/1Bq2lX7cruUbklLwgjGggSw
提取码:byte
——重庆教主 2024年1月22日