无论什么类型,所有的数据都是一系列的位,即0和1。变量的含义是通过解释这些程序的方式来传达的。最简单的是char类型,这种类型用一个数字表示Unicode字符集中的一个字符。实际上,这个数字与ushort的存储方式完全相同——它们都存储在0~65535之间。
然而,一般的,不同类型的变量使用不同的模式来表示数据,这意味着,即使把一系列的位从一种类型的变量移动到另一种类型的变量中,结果往往与预期不同。
这并不是数据位从一个变量到另一个变量的一对一的映射,而是需要对数据类型进行转换。类型转换有隐式转换和显示转换之分。
隐式转换:从A类型到B类型的转换可以再所有情况下进行,转换规则比较简单,可以让编译器执行。转换规则:任何类型A只要其取值范围完全包含在类型B的取值范围内,就可以隐式转换为类型B;
显示转换:从A类型到B类型的转换只能在某些情况下进行,转换规则比较复杂,需要进行某种类型处理。
请看下面例子:
//尝试将short值转换成byte值 byte destinationVar; short sourceVar=7; destinationVar=sourceVar; Console.WriteLine("sourceVar:{0}",sourceVar); Console.WriteLine("destinationVar:{0}",destinationVar);
如果编译这段代码,就会出现以下错误:
Cannot implicitly convert type 'short' to 'byte'. An explicit conversion exists(are you missing a cast?)
从而引入强制转换(强迫数据从一种类型转换成另一种类型)语法比较简单:<(destinationVar的类型)sourceVar>,也就是改成:
byte destinationVar; short sourceVar=7; destinationVar=(byte)sourceVar; Console.WriteLine("sourceVar:{0}",sourceVar); Console.WriteLine("destinationVar:{0}",destinationVar);
这将把<sourceVar>中的short类型的值转换为<destinationVar>中byte类型的值。当然,这只是在某些情况下是可行的,彼此之间几乎没有什么关系的类型或根本没有关系的类型不能强制转换类型。
显示的把数据从一种类型转换为另一种类型时,可能导致数据溢出,因为源变量的取值范围与目标变量的取值范围往往有出入,我们可以从其存储的数据本身(开始说了,实际是一系列的位)得到解析。
检查溢出,要用到两个关键字checked和uncheked,称为表达式溢出的检查上下文。
byte destinationVar; short sourceVar=7; destinationVar=checked((byte)sourceVar); Console.WriteLine("sourceVar:{0}",sourceVar); Console.WriteLine("destinationVar:{0}",destinationVar);
如果修改变量sourceVar的值,使其大于255,执行程序就会出错,并提示溢出。
当然,还有Convert命令,它也用于显示的类型转换,下面给出以上所有类型转换的一个实例:
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { short shortResult, shortVar = 4; int integerVar = 67; long longResult; float floatVar = 10.5F; double doubleResult, doubleVar = 99.999; string stringResult, stringVar = "17"; bool boolVar = true; Console.WriteLine("Variable Conversion Examples\n"); doubleResult = floatVar * shortVar; Console.WriteLine("Implicit,->double:{0}*{1}->{2}", floatVar, shortVar, doubleResult); shortResult = (short)floatVar; Console.WriteLine("Implicit,->short:{0}->{1}", floatVar, shortResult); stringResult = Convert.ToString(boolVar) + Convert.ToString(doubleVar); Console.WriteLine("Implicit,->string:\"{0}\"+\"{1}\"->{2}", boolVar, doubleVar, stringResult); longResult = integerVar + Convert.ToInt64(stringVar); Console.WriteLine("Mixed, ->long:{0}+{1}->{2}", integerVar, stringVar, longResult); Console.ReadKey(); } } }