C的隐式类型转换和显式类型转换
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C#的隐式类型转换和显式类型转换
C#的隐式类型转换
在C#语言中,一些预定义的数据类型之间存在着预定义的转换。比如,从int类型转换到long类型。C#语言中数据类型的转换可以用分为两
类:隐式转换(implicit conversions)和显式转换(explicit conversions)。这篇文章我们将详细介绍这两类转换。
1. 隐式类型转换
隐式转换就是系统默认的、不需要加以声明就可以进行的转换。在隐式转换过程中,编译器无需对转换进行详细检查就能够安全地执行转换。
比如从int类型转换到long类型就是一种隐式转换。隐式转换一般不会失败,转换过程中也不会导致信息丢失。
比如:
int i=10;
long l=i;
装箱转换实际上就是一种隐式类型转换。在本节,我们还将讲解以下隐式转换的规则:
1.1 隐式数值转换
隐式数值转换包括以下几种:
●从sbyte类型到short,int,long,float,double,或decimal类型。
●从byte类型到
short,ushort,int,uint,long,ulong,float,double,或decimal类型。
●从short类型到int,long,float,double,或decimal类型。
●从ushort类型到int,uint,long,ulong,float,double,或decimal 类型。
●从int类型到long,float,double,或decimal类型。
●从uint类型到long,ulong,float,double,或decimal类型。
●从long类型到float,double,或decimal类型。
●从ulong类型到float,double,或decimal类型。
●从char类型到ushort,int,uint,long,ulong,float,double,或decimal类型。
●从float类型到double类型。
其中,从int,uint,或long到float以及从long到double的转换可能会导致精度下降,但决不会引起数量上的丢失。其它的隐式数值转换则不会
有任何信息丢失。
结合我们在数据类型中学习到的值类型的范围,我们可以发现,隐式数值转换实际上就是从低精度的数值类型到高精度的数值类型的转换。
从上面的10条我们可以看出,不存在到char类型的隐式转换,这意味着其它整型值不能自动转换为char类型。这一点我们需要特别注意。
下面的程序给出了隐式数值转换的例子。
程序清单1-1:
using System;
class Test
{
public static void Main()
{
byte x=16;
Console.WriteLine("x={0}",x);
ushort y=x;
Console.WriteLine("y={0}",y);
y=65535;
Console.WriteLine("y={0}",y);
float z=y;
Console.WriteLine("z={0}",z);
}
}程序的输出将是:
x=16;
y=16;
y=65535;
z=65535;
如果我们在上面程序中的语句之后再加上一句:
y=y+1;
再重新编译程序时,编译器将会给出一条错误信息:
can not implictly convert type 'int' to type 'ushort'
这说明,从整数类型65536到无符号短整型y不存在隐式转换。1.2 隐式枚举转换
隐式枚举转换允许把十进制整数0转换成任何枚举类型,对应其它的整数则不存在这种隐式转换。还是让我们用例子来说明。
程序清单1-2:
using System;
enum Weekday{
Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday };
class Test
{
public static void Main(){
Weekday day;
day=0;
Console.WriteLine(day);
}
}程序的输出是:
但是如果我们把语句day=0改写为day=1,编译器就会给出错误:
Can not implictly convert type 'int' type 'enum'
1.3 隐式引用转换
隐式引用转换包括以下几类:
●从任何引用类型到对象类型的转换
●从类类型s到类类型t的转换,其中s是t的派生类。
●从类类型s到接口类型t的转换,其中类s实现了接口t。
●从接口类型s到接口类型t的转换,其中t是s的父接口。
从元素类型为Ts的数组类型S向元素类型为Tt的数组类型T转换,这种转换需要满足下列条件:
●S和T只有元素的数据类型不同,但它们的维数相同。
●Ts和Tt都是引用类型。
●存在从Ts到Tt的隐式引用转换
●从任何数组类型到System.Array的转换。
●从任何代表类型到System.Delegate的转换。
●从任何数据类型或代表类型到System.ICLoneable的转换。
●从空类型(null)到任何引用类型的转换。
比如,下面的程序无法通过编译,因为数组的元素类型是值类型,C#中不存在这样的隐式转换。
程序清单1-3:
using System;
class Test
{