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);
}
}程序的输出是:
0
但是如果我们把语句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
{
public static void Main(){
float[] float_arr=new float[10];
int[] int_arr=new int[10];
float_arr=int_arr;
}
}
而下面这段程序则是正确的:
程序清单1-4:
using System;
class Class1
{}
class Class2:Class1
{}
class Test
{
public static void Main(){
Class1[] class1_arr=new Class1[10];
class2[] class2_arr=new Class2[10];
class1_arr=class2_arr;writeline输出数值变量
}
}
程序1-5很有趣,它给出了我们常用的值类型在系统环境中的原型定义。
程序1-5:
using System;
class Test
{
public static void Main(){
float[] float_arr=new float[10];
double[] double_arr=new double[10];
sbyte[] sbyte_arr=new sbyte[10];
byte[] byte_arr=new byte[10];
ushort[] ushort_arr=new ushort[10];
int[] int_arr=new int[10];
long[] long_arr=new long[10];
string[] string_arr=new string[10];
console.WriteLine(float_arr);
Console.WriteLine(double_arr);
Console.WriteLine(sbyte_arr);
Console.WriteLine(byte_arr);
Console.WriteLine(ushort_arr);
Console.WriteLine(int_arr);
Console.WriteLine(long_arr);
Console.WriteLine(string_arr);
}
}
程序的输出结果是:
System.Single[];
System.Double[];
System.Sbyte[];
System.Byte[];
System.Int16[];
system.Int32[];
System.Int64[];
System.String[];
2.C#的显式类型转换
显式类型转换,又叫强制类型转换。与隐式转换正好相反,显式转换需要用户明确地指定转换的类型。比如下面的例子把一个类型显式转换为
类型:
long l=5000;
int i=(int)l;
拆箱转换就是一种显式转换。这里我们还将讲解以下转换的规则:
●显式数值转换
●显式枚举转换
●显式引用转换
显式转换可以发生在表达式的计算过程中。它并不是总能成功,而且常常可能引起信息丢失。
显式转换包括所有的隐式转换,也就是说把任何系统允许的隐式转换写成显式转换的形式都是允许的,如:
int i=10;
long l=(long)i;
2.1 显式数值转换
显式数值转换是指当不存在相应的隐式转换时,从一种数字类型到另一种数字类型的转换。包括:
●从sbyte到byte,ushort,uint,ulong,或char。
●从byte到sbyte或char。
●从short到sbyte,byte,ushort,uint,ulong,或char。
●从ushort到sbyte,byte,short,或char。
●从int到sbyte,byte,short,ushort,uint,ulong,或char。
●从uint到sbyte,byte,short,ushort,int,或char。
●从long到sbyte,byte,short,ushort,int,uint,ulong,或char。
●从ulong到sbyte,byte,short,ushort,int,uint,long,或char。
●从char到sbyte,byte,或short。
●从float到sbyte,byte,short,ushort,int,uint,long,ulong,char,或decimal。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论