大家都知道在C#中,如果B类继承自A类,如果一个对象是B类型的但是转换为A类型之后,这个对象是无法在调用属于B类型的方法的,如下例子:
基类A:
public class A { }
派生类B:
public class B : A { public void Test() { Console.WriteLine("Hello World!"); } }
如果我们这样写:
A a = new B(); a.Test();
我们会发现编译器编译不能通过,有如下的错误:
最近看了一下《C# 从现象到本质》。这本书上写 " 通过IL实现令对象a可以调用B的方法 ",我琢磨了好久才想了一个例子,IL代码如下:
.assembly extern mscorlib { auto } .assembly MyTest {} .module MyTest.exe .class public A { .method public specialname void .ctor() { ldarg.0 call instance void [mscorlib]System.Object::.ctor() ret } } .class public B extends A { .method public specialname void .ctor() { ldarg.0 call instance void A::.ctor() ret } .method public void Test() { ldstr "helle world!" call void [mscorlib]System.Console::WriteLine(string) ret } } .method public static void Main() { .entrypoint .locals (class A V_0) newobj instance void B::.ctor() stloc.0 ldloc.0 call instance void B::Test() ret }
将代码写到一个 test.il 的空文件中,然后打开 " VS2015开发人员命令提示 ",输入 " ilasm test.il ",如下:
执行成功,生成一个 "test.exe" ,在命令窗体中执行一下,如下图:
正如说书上说的IL中是可以让编译时对象执行运行时对象的方法的。