在 C# 中,类型转换(Type Conversion)主要分为隐式转换显式转换类型转换方法安全类型转换几种方式。

1. 隐式转换(Implicit Conversion)

数据类型兼容且不会丢失数据时,编译器自动完成转换。

int num = 100;
long bigNum = num;    // int -> long

float f = 10;
double d = f;         // float -> double

常见隐式转换:

源类型 目标类型
byte short、int、long、float、double、decimal
short int、long、float、double、decimal
int long、float、double、decimal
float double

2. 显式转换(Cast)

可能发生数据丢失时,需要强制转换。

double d = 123.45;
int i = (int)d;

Console.WriteLine(i); // 123

long l = 1000;
int n = (int)l;

注意:

double d = 9999999999;
int i = (int)d; // 可能溢出

3. Convert 类转换

适用于字符串与基础数据类型之间转换。

string str = "123";

int i = Convert.ToInt32(str);
double d = Convert.ToDouble(str);
bool b = Convert.ToBoolean("true");

示例:

string price = "99.8";

double p = Convert.ToDouble(price);

Console.WriteLine(p);

4. Parse 方法

将字符串转换为指定类型。

string str = "100";

int num = int.Parse(str);
double d = double.Parse("123.45");
DateTime dt = DateTime.Parse("2025-01-01");

异常情况:

int.Parse("abc"); // FormatException

5. TryParse(推荐)

转换失败不会抛异常。

string str = "123";

if (int.TryParse(str, out int result))
{
    Console.WriteLine(result);
}
else
{
    Console.WriteLine("转换失败");
}

简写:

if (int.TryParse("456", out var value))
{
    Console.WriteLine(value);
}

6. ToString()

转换为字符串。

int num = 100;

string str = num.ToString();

格式化:

double price = 1234.567;

Console.WriteLine(price.ToString("F2")); // 1234.57
Console.WriteLine(price.ToString("N"));  // 1,234.57
Console.WriteLine(price.ToString("P"));  // 百分比

7. as 运算符

仅适用于引用类型和可空类型。

object obj = "Hello";

string str = obj as string;

if (str != null)
{
    Console.WriteLine(str);
}

等价于:

string str = obj is string ? (string)obj : null;

8. is 模式匹配(推荐)

object obj = "Hello";

if (obj is string text)
{
    Console.WriteLine(text);
}

9. object 与具体类型转换

装箱(Boxing):

int num = 100;

object obj = num;

拆箱(Unboxing):

object obj = 100;

int num = (int)obj;

错误示例:

object obj = "100";

int num = (int)obj; // InvalidCastException

正确做法:

int num = Convert.ToInt32(obj);

10. 自定义类型转换

通过 implicitexplicit 关键字实现。

public class Meter
{
    public double Value { get; set; }

    public static implicit operator double(Meter m)
    {
        return m.Value;
    }

    public static explicit operator Meter(double d)
    {
        return new Meter { Value = d };
    }
}

使用:

Meter m = (Meter)10.5;

double d = m;

Console.WriteLine(d);

常用转换速查表

转换场景 推荐方式
int → long 隐式转换
double → int (int)
string → int int.TryParse()
string → double double.TryParse()
任意类型 → string ToString()
object → 具体类型 is(类型)
引用类型转换 as
自定义对象转换 implicit/explicit

实际开发建议

  1. 字符串转数字优先使用 TryParse()
  2. 引用类型判断优先使用 is 模式匹配。
  3. 避免频繁装箱/拆箱,影响性能。
  4. 涉及金额时优先使用 decimal 而非 double
  5. 显式转换前注意数据范围,防止溢出。

更多推荐