在C#中,类型转换分为隐式类型转换(Implicit Type Conversion)和显式类型转换(Explicit Type Conversion),也称为隐式转换和强制转换。
隐式类型转换(Implicit Type Conversion)
隐式类型转换是编译器自动执行的,不需要程序员明确指定。当一种类型的数据可以安全地转换为另一种类型时,编译器会自动进行隐式转换。这种转换不会导致数据丢失或改变数据的意义。
以下是一些常见的隐式类型转换示例:
- 整数类型之间的转换:从小到大的整数类型(如
byte
到int
,int
到long
)可以隐式转换。
byte b = 10;
int i = b; // 隐式转换,byte到int
- 浮点类型之间的转换:
float
到double
的转换是隐式的。
float f = 3.14f;
double d = f; // 隐式转换,float到double
- 整数到浮点数的转换:整数类型(如
int
)可以隐式转换为浮点数类型(如float
或double
)。
int number = 10;
double floatingNumber = number; // 隐式转换,int到double
- 常量表达式中的转换:在编译时常量表达式中,如果值的范围适合目标类型,则可以进行隐式转换。
double result = 3.0 / 2; // 隐式转换,整数3和2在运算时提升为double类型
- 空值到引用类型的转换:将
null
值赋给引用类型变量是隐式的。
string str = null; // 隐式转换,null到string
显式类型转换(Explicit Type Conversion)
显式类型转换需要程序员明确指定,通常使用类型转换运算符(如(Type)
)来执行。这种转换可能会丢失数据或改变数据的意义,因此需要程序员自行承担风险。
以下是一些常见的显式类型转换示例:
- 整数类型之间的转换:从大到小的整数类型转换需要显式转换,因为可能会丢失数据。
int i = 256;
byte b = (byte)i; // 显式转换,int到byte,数据丢失(b的值为0)
- 浮点类型到整数类型的转换:浮点数转换为整数类型时,小数部分会被丢弃。
double d = 3.14;
int i = (int)d; // 显式转换,double到int,i的值为3
- 引用类型之间的转换:当尝试将一种引用类型转换为另一种不兼容的引用类型时,需要显式转换(通常通过接口或基类进行)。
Animal animal = new Dog(); // Dog是Animal的子类
Dog dog = (Dog)animal; // 显式转换,Animal到Dog(如果animal实际上引用的是Dog对象,则成功)
- 对象到基本数据类型的转换:如果对象包含可以转换为基本数据类型的数据,可以通过调用适当的方法(如
Parse
或TryParse
)或进行拆箱来执行显式转换。
string str = "123";
int number = int.Parse(str); // 显式转换,string到int
在编写代码时,应谨慎使用显式类型转换,并确保转换是安全的,以避免运行时错误或数据丢失。