日期:2014-05-17  浏览次数:20861 次

虚方法调用产生IL代码,有一处不太明白,求助!!!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ConstDomain;

namespace CLRConst
{
    public class A
    {
        public virtual void Print()
        {
            Console.WriteLine("A Print");
        }
    }
    public class B : A
    {

    }
    public class C : B
    {
        public override void Print()
        {
            Console.WriteLine("B Print");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            A a = new A();
            a.Print(); //IL代码:callvirt   instance void CLRConst.A::Print()
            A b = new C();
            b.Print();//IL代码:callvirt   instance void CLRConst.A::Print()
            C c = new C();
            c.Print();//IL代码:callvirt   instance void CLRConst.A::Print() 这里有不理解
            Console.Read();
        }
    }
}

对于a.Print()和b.Print()的IL代码没有异议,编译器只关心变量声明类型(都是A)所以可以调用Print
其后编译器发现Print是虚方法,因此调用指令为callvirt
所以产生的IL代码 :callvirt(虚调用)   instance void CLRConst.A(变量类型都是A)::Print() 是可以理解的。
但是对于 C c=new C();c.Print()的IL代码有点不明白,编译器关心声明类型(这里是C)
所以我觉得产生的指令应该是:callvirt   instance void CLRConst.C