
2.6 C#中实现数据转换
C#提供了多种数据类型,定义变量和数组时都要声明数据类型,有时也需要将已经声明的变量改变数据类型来使用,这就涉及数据类型的转换。本节介绍数据类型转换的基本方法。
2.6.1 隐式类型转换
在C#引入var类型的变量之前,隐式转换仅存在于数值类型的数据之间,引入var类型之后,var定义的变量可以实现隐式数据转换,下面详细说明。
1. 数值类型数据
隐式数据类型转换适用于数值类型的数据之间。int、float、double类型都属于数值类型。隐式数据类型转换应遵循以下规则才能实现。
对于数值类型,任何数据类型A,只要其取值范围完全包含在类型B的取值范围之内,就可以实现隐式类型转换。即整型数据(int)类型可以隐式转换为浮点型(float)和双精度型(double)数据,浮点型(float)数据可以隐式转换为双精度型(double)数据。下面的代码片段说明隐式数据转换。
int num1 = 3; float num2=num1; double num3=num1+num2;
整型数据num1可以直接赋值给浮点型数据num2,浮点型数据可以和整型数据相加转换为双精度型数据,说明存在隐式数据类型转换。
2. var类型数据
这是由var数据类型定义的特点决定的。var定义的变量的数据类型是由赋值的数据决定的。如var strname=”张小二”,赋值为字符串类型,此时strname变量就是字符串类型的数据变量,那么和string类型的数据即可实现隐式转换,其他数据类型也是如此。如下代码片段可以说明var隐式转换。
01 var strname = "李小二"; 02 string name = strname; 03 var intger = 12; 04 int num = intger;
如果将第2行代码改为下面的代码,就会出现编译错误,提示无法将“string”隐式转换为“int”。
var strname = "李小二"; int name = strname;
注意
var数据类型隐式转换时必须保证转换的数据类型和赋值的数据类型相匹配。
2.6.2 显式类型转换
【本节示例参考:\源代码\C2\Example_ConvertTest1】
与隐式类型转换相反的是显式类型转换,通过显式数据转换,可以把取值范围大的数据转换为取值范围小的数据。代码2.10说明了显式数据转换的方法。
代码2.10 显式数据转换
01 using System; 02 using System.Collections.Generic; 03 using System.Linq; 04 using System.Text; 05 06 namespace Example_ConvertTest1 07 { 08 class ConvertTest 09 { 10 /// <summary> 11 /// 计算商品总价 12 /// </summary> 13 /// <param name="args"></param> 14 static void Main(string[] args) 15 { 16 int num1 = 3; //商品数 17 float num2=num1; //隐式转换 18 double num3 = 45.24; //商品单价 19 int num4; //商品总价 20 num4 = num1* num3; 21 Console.WriteLine("整型数据转换为浮点型数据{0}",num2); 22 Console.WriteLine("总价格为{0}", num4); 23 Console.ReadKey(); 24 } 25 } 26 }
这段代码编译时会出现错误,错误消息如图2.8所示。

图2.8 代码2.10编译错误列表
编译器的错误消息说明了出现错误的行数和错误的原因,第20行代码缺少强制转换。将第20行代码修改为:
num4 = num1*(int) num3;
再次调试程序运行结果如图2.9所示。

图2.9 显式转换运行结果
2.6.3 字符串与数值之间的转换
C#中不仅仅存在数值类型数据之间的互相转换,字符串和数值之间也是可以互相转换的,只是方法不同而已。
1. 数值型转换为字符串
数值型数据转换为字符串用ToString()方法即可实现。
int num1 = 10; string mynum = num1.ToString();
2. 字符串转换为数值型
字符串数据转换为数值型使用Parse()方法。
字符串转换为整型:int.Parse(string); 例如:
string str = "13"; int number = int.Parse(str);
字符串转换为双精度浮点型:double.Parse(string); 例如:
string str = "14"; double number = double.Parse(str);
字符串转换为单精度浮点型:float.Parse(string); 例如:
string str = “15”; float number = float.Parse(str);
提示
不是任意字符串都可以转换为数值型数据,只有能够表示成数字的字符串才可以进行转换。例如,名字“李小二”,转换成数字没有可以符合的表达方式,就不能实现转换。
注意
Parse()括号中的参数只能是字符串,不能为其他数据类型。
2.6.4 用Convert类实现数据类型转换
【本节示例参考:\源代码\C2\Example_ConvertTest2】
通过前面的学习已经知道.Net Framework提供了很多类库,其中Convert类就是专门进行类型转换的类,它能够实现各种基本数据类型之间的相互转换。表2.9列出了Convert类的常用方法。
表2.9 Convert类常用的类型转换方法

代码2.11演示了Convert类转换数据类型的方法。
代码2.11 使用Convert类转换数据类型ConvertEX.cs
01 using System; 02 using System.Collections.Generic; 03 using System.Linq; 04 using System.Text; 05 06 namespace Example_ConvertTest2 07 { 08 class ConvertEX 09 { 10 static void Main(string[] args) 11 { 12 float num1 = 82.26f; //原始数值 13 int integer,num2; //转换后的整型 14 string str, strdate; //转换后的字符串型 15 DateTime mydate=DateTime.Now; //把当前时间赋给日期型变量 16 //Convert类的方法进行转换 17 integer = Convert.ToInt32(num1); 18 str = Convert.ToString(num1); 19 strdate = Convert.ToString(mydate); 20 num2 = Convert.ToInt32(mydate); 21 //输出结果 22 Console.WriteLine("转换为整型数据的值{0}",integer); 23 Console.WriteLine("转换为字符串{0}",str); 24 Console.WriteLine("日期型数据转换为字符串值为{0}",strdate); 25 Console.ReadKey(); 26 } 27 } 28 }
代码2.11生成解决方案时没有出现错误信息,但是在运行时出现错误,如图2.10所示。

图2.10 代码2.11运行时错误
说明第20行代码从日期型数据转换为整形数据无效,.NET不支持这样的数据类型转换。因为日期型变量有固定的格式,要求转换的数据必须是有效的整型数据。第19行代码从日期型数据转换为字符串没有任何问题。把第20行代码进行修改后重新运行,得到如图2.11所示结果。

图2.11 代码2.11修改后运行结果
从结果可以看出,转换为int型数据后进行了四舍五入的计算。
提示
用Convert类转换时也要注意数据表达方式的有效性,并不是任意类型之间都可以转换。