常量的强制转换是在编译时完成的。
为了证明这一点,您可以使用.Net Reflector检查生成的代码。
例如,这段代码:
static void Main()
{
int i = (int) 10.5;
const double d = 10.0;
float f = (float)d;
Console.WriteLine(i);
Console.WriteLine(f);
}
产生:
private static void Main()
{
int i = 0xa;
float f = 10f;
Console.WriteLine(i);
Console.WriteLine(f);
}
或作为 IL:
.method private hidebysig static void Main() cil managed
{
.entrypoint
.maxstack 1
.locals init (
[0] int32 i,
[1] float32 f)
L_0000: ldc.i4.s 0xa
L_0002: stloc.0
L_0003: ldc.r4 10
L_0008: stloc.1
L_0009: ldloc.0
L_000a: call void [mscorlib]System.Console::WriteLine(int32)
L_000f: ldloc.1
L_0010: call void [mscorlib]System.Console::WriteLine(float32)
L_0015: ret
}
如您所见,没有发生运行时强制转换。发布或调试版本也是如此。