C#A类派生类强转基类IL居然还是可以调用派生类中方法的例子

大家都知道在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中是可以让编译时对象执行运行时对象的方法的。

posted @ 2019-11-22 22:46  霁雪湖上三映月  阅读(419)  评论(1编辑  收藏  举报