0Pricing
C# Academy · 课时

隐式转换与显式转换

在兼容类型之间安全地进行转换。

隐式转换与显式转换 是 CoddyKit 上的免费 C# Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 4 节课。

在类型之间进行转换

C# 可以将一种数值类型转换为另一种。有些转换会自动发生(隐式转换),而另一些则需要显式的强制转换。

using System;

class Program
{
    static void Main()
    {
        int i = 10;
        double d = i;       // implicit
        int back = (int)d;   // explicit
        Console.WriteLine(d + ", " + back);
    }
}

隐式(扩大)转换

当不会丢失数据时,可以进行隐式转换,例如从 int 转换为 long,或从 int 转换为 double。不需要强制转换。

using System;

class Program
{
    static void Main()
    {
        int i = 42;
        long l = i;      // widening, safe
        double d = i;    // widening, safe
        Console.WriteLine(l + ", " + d);
    }
}

为什么扩大转换是安全的

目标类型可以表示源类型的每一个值,因此编译器会静默地允许这种转换。

using System;

class Program
{
    static void Main()
    {
        byte b = 200;
        int i = b;       // byte fits in int
        Console.WriteLine("byte " + b + " -> int " + i);
    }
}

显式(缩小)转换

当数据可能丢失时,需要进行显式转换(强制转换),例如从 double 转换为 int。您需要写出 (int)value。

using System;

class Program
{
    static void Main()
    {
        double d = 9.78;
        int i = (int)d;   // truncates toward zero -> 9
        Console.WriteLine(i);
    }
}

强制转换会截断,而不会四舍五入

将浮点值强制转换为整数时,会去掉小数部分,而不会进行四舍五入。如果需要四舍五入,请先使用 Math.Round。

using System;

class Program
{
    static void Main()
    {
        double d = 7.99;
        Console.WriteLine("Cast: " + (int)d);
        Console.WriteLine("Round: " + (int)Math.Round(d));
    }
}

缩小转换中的溢出

如果某个值无法放入目标类型,普通强制转换可能会静默地循环回绕。请将其放在 checked 中,以便在溢出时抛出异常。

using System;

class Program
{
    static void Main()
    {
        int big = 300;
        byte wrapped = (byte)big;   // 300 wraps to 44
        Console.WriteLine("Wrapped: " + wrapped);

        try
        {
            byte safe = checked((byte)big);
            Console.WriteLine(safe);
        }
        catch (OverflowException)
        {
            Console.WriteLine("checked caught overflow");
        }
    }
}

精度丢失

即使是某些扩大转换,例如将非常大的 long 转换为 float,也可能丢失精度,尽管它们仍然属于隐式转换。

using System;

class Program
{
    static void Main()
    {
        long big = 9007199254740993L;
        double approx = big;   // implicit, may lose precision
        Console.WriteLine("long: " + big);
        Console.WriteLine("double: " + approx.ToString("F0"));
    }
}

字符型与数值转换

char 会隐式转换为其数值编码,也可以将数字显式强制转换回 char。

using System;

class Program
{
    static void Main()
    {
        char c = 'A';
        int code = c;          // implicit -> 65
        char next = (char)(code + 1);   // explicit -> B
        Console.WriteLine(code + " -> " + next);
    }
}

表达式中的转换

在混合算术运算中,较小的类型会在运算前自动提升为较大的类型。

using System;

class Program
{
    static void Main()
    {
        int a = 7;
        double b = 2;
        double result = a / b;   // a promoted to double -> 3.5
        Console.WriteLine(result);
    }
}

整数除法陷阱

如果两个操作数都是整数,执行的就是整数除法。先将其中一个操作数强制转换为 double,即可得到小数结果。

using System;

class Program
{
    static void Main()
    {
        int a = 7, b = 2;
        Console.WriteLine("int / int: " + (a / b));
        Console.WriteLine("with cast: " + ((double)a / b));
    }
}

综合运用

在安全的情况下优先使用隐式转换,需要缩小转换时使用显式强制转换,并注意截断、溢出和整数除法。

using System;

class Program
{
    static void Main()
    {
        int total = 17, count = 5;
        double average = (double)total / count;   // cast to avoid integer division
        int rounded = (int)Math.Round(average);
        Console.WriteLine("avg=" + average + ", rounded=" + rounded);
    }
}

快速检查

测试您对类型转换的理解。

复习

隐式(扩大)转换会在不丢失数据时自动发生(int 转为长整型、int 转为双精度浮点型)。显式(缩小)转换需要使用类似 (int)x 的强制转换,并且可能造成截断或溢出。使用 checked 检测溢出,并将值转换为双精度浮点型以避免整数除法。

using System;

class Program
{
    static void Main()
    {
        double d = 3.9;
        int i = (int)d;     // explicit, truncates to 3
        long l = i;          // implicit widening
        Console.WriteLine(i + ", " + l);
    }
}

常见问题解答

「隐式转换与显式转换」课时是免费的吗?

是的 — 「隐式转换与显式转换」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 4 节课。

「隐式转换与显式转换」这节课中我会学到什么?

在兼容类型之间安全地进行转换。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C# Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「隐式转换与显式转换」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C# Academy 课中编写并运行代码吗?

能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 值类型与引用类型
  2. 装箱与拆箱
  3. 隐式转换与显式转换
  4. Convert 类与解析
← 返回 C# Academy