隐式转换与显式转换
在兼容类型之间安全地进行转换。
隐式转换与显式转换 是 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 反馈 — 无需本地设置。
此课程中的所有课时
- 值类型与引用类型
- 装箱与拆箱
- 隐式转换与显式转换
- Convert 类与解析