在C#中,类型转换分为隐式转换和显式转换两种基本形式。隐式转换由编译器自动进行,常见于取值范围小的类型赋值给取值范围大的类型;显式转换则必须由开发者写明转换方式,用于处理可能丢失数据或不在自动转换范围内的场景。

什么是隐式转换
隐式转换不需要特殊语法,只要目标类型能完全容纳源类型的数据就不会报错。例如整数类型int赋值给long,或者派生类对象赋值给基类引用。
int a = 10; long b = a; // 隐式转换,编译器自动处理 Console.WriteLine(b); object obj = "hello"; // string隐式转为object Console.WriteLine(obj);
什么是显式转换
当转换可能导致数据丢失或类型之间不存在继承关系时,必须使用显式转换。常见做法包括强制转换符和Convert类。
使用强制转换符
强制转换用括号包裹目标类型,如果转换失败会抛出InvalidCastException。
double d = 9.78; int i = (int)d; // 显式转换,截断小数部分,i变为9 Console.WriteLine(i); object o = 123; int num = (int)o; // 必须确认o实际是int才能转换
使用Convert类
System.Convert提供一组静态方法,适合在数值类型或字符串之间做更灵活的转换。
string s = "456"; int val = Convert.ToInt32(s); // 字符串转整数 Console.WriteLine(val); double pi = 3.14; int rounded = Convert.ToInt32(pi); // 四舍五入,结果为3
隐式与显式转换对比
| 转换方式 | 是否需要手动写代码 | 风险 |
|---|---|---|
| 隐式转换 | 否 | 低,编译器保证安全 |
| 显式转换 | 是 | 可能丢精度或抛异常 |
自定义类型的转换
通过implicit和explicit关键字,可以为自定义类定义转换规则。
class Meter
{
public int Value { get; set; }
public static implicit operator Centimeter(Meter m)
{
return new Centimeter { Value = m.Value * 100 };
}
}
class Centimeter
{
public int Value { get; set; }
}
Meter m = new Meter { Value = 2 };
Centimeter c = m; // 调用隐式转换
Console.WriteLine(c.Value); // 输出200
理解显式与隐式转换的区别,能让你在C#中更稳妥地处理数据,减少运行时错误。