假设我们在 C# 中有以下示例代码:
class BaseClass
{
public virtual void HelloWorld()
{
Console.WriteLine("Hello Tarik");
}
}
class DerivedClass : BaseClass
{
public override void HelloWorld()
{
base.HelloWorld();
}
}
class Program
{
static void Main(string[] args)
{
DerivedClass derived = new DerivedClass();
derived.HelloWorld();
}
}
当我 ildasmed 以下代码时:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 15 (0xf)
.maxstack 1
.locals init ([0] class EnumReflection.DerivedClass derived)
IL_0000: nop
IL_0001: newobj instance void EnumReflection.DerivedClass::.ctor()
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: callvirt instance void EnumReflection.BaseClass::HelloWorld()
IL_000d: nop
IL_000e: ret
} // end of method Program::Main
但是, csc.exe 转换为derived.HelloWorld();
--> callvirt instance void EnumReflection.BaseClass::HelloWorld()
。这是为什么?我没有在Main
方法中的任何地方提到 BaseClass 。
而且,如果它正在调用,BaseClass::HelloWorld()
那么我会期望call
而不是callvirt
因为它看起来直接调用BaseClass::HelloWorld()
方法。