日期:2008-04-28  浏览次数:20428 次

迈克老猫
来自:老猫的理想

本教程参考C#和ASP.NET程序设计教程撰写,有什么不足之处请大家指出,或在老猫的理想BLOG留言。


这次我们首先讲解一下类型转换,我们在写程序时经常用到类型转换,而且特别多的规则。我在这里粗略的讲解一下。
隐式转换是系统默认的、不需要加以声明即可进行的转换。
1.隐式数值转换
隐式数值转换实际上就是从低精度的数值类型转换到高精度的数值类型的转换。
byte x=255;ushort y=x;y=65535;float z=y;//均从低精度到高精度,反之会产生溢出
隐式数值转换的类型太多,我就不多介绍,记住上面的原则就可以了。详细规则可查看msdn
2.隐式枚举转换
隐式枚举转换用于把十进制整数0转换成任何枚举类型,对应的其他整数则不存在这种转换。
using System;
enum Color
{
Red,Green,Blue
};
class MikeCat
{
static void Main()
{
Color c;//声明Color的变量c;
c=0;//将0转换为Red;
Console.WriteLine("c的值是{0}",c);//结果:c的值是Red;如果将c=0改成c=1,则编译器会给出错误。
}
}
3.隐式引用转换
从任何引用类型到object的转换。
从类类型A到类类型B的转换,其中类A从类B派生得到。
从类类型A到接口类型B的转换,其中类A实现了接口B。
从接口类型A到接口类型B的转换,其中接口A是从接口B派生。
从任何数组类型到System.Array的转换。
从任何委托类型到System.Delegate的转换。
从任何数组类型或委托类型到System.ICloneable的转换。
从空类型(null)到任何引用类型的转换。
显示转换也称为强制转换,它需要用户明确地指定转换的类型。
char c=(char)65;//A
int i=(int)'A';//65
显示转换包含所有的隐式转换,即任何系统允许的隐式转换写成显示转换的形式都是允许的。
int i=300;
long l=(long)i;
另外一例:
using System;
class MikeCat
{
static void Main()
{
long longValue = Int64.MaxValue;
int intValue = (int) longValue;
Console.WriteLine("(int){0} = {1}", longValue, intValue);
}
}
类型 long 转换为 int 是显式转换,它使用了强制转换表达式。输出为:
(int) 9223372036854775807 = -1这是因为有溢出发生。
1.显示数值转换
显示数值转换是指当不存在相应的隐式转换时从一种数值类型转换为另一种数值类型。转换类型也很繁琐,只需记住转换规则,详细查阅MSDN。由于显示数值转换可能丢失信息或引发异常,因此转换按以下原理被处理:简略说就是高精度显示转换为低精度会引发异常(OverFlowException),未引发异常的情况,源变量的值通过舍入得到最接近的整型值作为转换结果。详细转换时的异常情况查阅MSDN
/*test.cs*/
using System;
public class MikeCat
{
public static void Main()
{
ushort u=65535;
byte b=(byte)u;
Console.WriteLine("b的值是{0}",b);
}

}
编译状况如下:
E:\>csc test.cs
Microsoft (R) Visual C# .NET 编译器版本 7.10.3052.4
用于 Microsoft (R) .NET Framework 版本 1.1.4322
版权所有 (C) Microsoft Corporation 2001-2002。保留所有权利。
E:\>test.exe
b的值是255
E:\>csc/checked test.cs ///checked[+|-] 生成溢出检查
E:\>test.exe
未处理的异常: System.OverflowException: 算术运算导致溢出。
at MikeCat.Main()
E:\>csc/checked- test.cs
E:\>test.exe
b的值是255
2.显示枚举转换
显示枚举转换其实就是将枚举类型的元素类型与相应类型之间进行隐式显示转换。比如,有一个元素类型int的枚举类型E,当执行从E到byte的显示枚举转换时,实际执行的是从int到byte的显示数值转换。
using System;
enum Color
{
Red,Green,Blue
};
public class MikeCat
{
static void Main()