概述
因为C#语言中的数据类型是强类型(即在编译时是静态类型的),在声明了一个变量之后,它不能被再次声明或赋值为另一个数据类型,除非该类型可以隐式转换为变量的类型。
比如:string
类型不能隐式转换成int
类型。因此,在将变量i
声明为int
类型后,不能将字符串”Hello”赋值给它,示例如下:
static void Main(string[] args)
{
int i;
i = "Hello";
}
编译器报错,提示:无法将类型“string”隐式转换为“int”,如图:
但是,有时可能需要将值从一种类型转换到另一种数据类型。例如,你可能需要将一个整型变量传递给一个参数类型为double
的方法,或者可能需要将类变量赋值给接口类型的变量。这些类型的操作称为数据类型转换。在C#语言中,可以执行以下数据类型的转换:
- 隐式转换:不需要特殊的语法,因为转换总是成功的,不会丢失数据。比如从较小的整型到较大的整型的转换,或者从派生类到基类的转换。
- 显式转换(强制转换):显式转换需要强制类型转换表达式。当转换中可能丢失信息,或者由于其他原因转换可能无法成功时,就需要强制转换。典型的例子如:将数值转换为精度较低或范围较小的类型,或者将基类实例转换为派生类。
- 用户自定义转换:用户自定义的转换是通过特殊方法执行的,你可以定义这些方法来支持在没有基类派生类关系的自定义类型之间进行显式和隐式转换。
- 转换帮助类:在不兼容的类型之间进行转换,例如整数与
System.DateTime
对象,或十六进制字符串与字节数组,你可以使用System.BitConverter
类,System.Convert
类,以及内置数值类型(如Int32.Parse
)的Parse
转换方法。
隐式转换
隐式转换可以完成从较小的整型到较大的整型的转换,比如可以完成下列从左到右的隐式转换:
char -> int -> long -> float -> double
示例代码如下:
char c = 'A';
int i = c;
long l = i;
float f = l;
double d = f;
Console.WriteLine($"c:{c}, i:{i}, l:{l}, f:{f}, d:{d}");
运行结果如图:
显式转换
显式转换适用于当转换中可能丢失信息,或者由于其他原因转换可能无法成功时,比如从较大整型到较小整型的转换时,而要显式转换:
double -> float -> long -> int -> char
比如以下的隐式转换是错误的:
提示:无法将类型”double”隐式转换为”int”。存在一个显式转换(是否缺少强制转换?)
这时,就需要显式(强制)转换,强制转换有多种方式:
- 在变量前使用小括号包裹目标数据类型
- 调用系统或者自定义的转换方法
- 使用
as
关键字(只适用于引用类型和可为空的类型)
这里还是以上面将double
类型显式转换为int
类型为例,代码如下:
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
double d = 200.55;
int i = (int)d;
Console.WriteLine($"i={i}");
}
}
}
运行结果如下:
从运行结果可以看到,在从double
类型转换到int
类型之后,数值的精度丢失的,原来d=200.55
,i
得到的转换结果为:200
类型转换方法
.NET中的Convert类中内置了许多类型转换的方法,比如:Convert.ToBoolean
, Convert.ToDouble
, Convert.ToString
, Convert.ToInt32
等等,上例使用Convert.ToInt32
的写法如下:
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
double d = 200.55;
int i = Convert.ToInt32(d);
Console.WriteLine($"i={i}");
}
}
}
运行结果如下:
发表评论
登录用户才能发表评论, 请 登 录 或者 注册
热门评论(1)
Priest (2023-02-22)
隐式转换 结果图错了 2 应该是50的ASCII码