我很想知道为什么会这样。请阅读下面的代码示例以及在每个部分下方的注释中发出的相应 IL:
using System;
class Program
{
static void Main()
{
Object o = new Object();
o.GetType();
// L_0001: newobj instance void [mscorlib]System.Object::.ctor()
// L_0006: stloc.0
// L_0007: ldloc.0
// L_0008: callvirt instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
new Object().GetType();
// L_000e: newobj instance void [mscorlib]System.Object::.ctor()
// L_0013: call instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
}
}
为什么编译器callvirt
为第一部分发出 a 而call
为第二部分发出 a ?编译器是否有任何理由会callvirt
为非虚拟方法发出指令?如果在某些情况下编译器会callvirt
为非虚拟方法发出 a ,这是否会给类型安全带来问题?