IL 提供了两种调用函数的语句,即 call 和 callvirt。Call 用于调用非虚拟或静态函数或编译器不想对引用进行空检查的任何函数。
callvirt 用于调用虚函数,也调用非虚函数,因为编译器在运行时对引用进行空检查。
现在在通过 C# 浏览 CLR 时,我发现了以下示例。
internal class SomeClass
{
public override String ToString()
{
return base.ToString();
}
}
现在 ToString() 是虚函数,但是编译器为其生成调用指令就可以了。但是 Jeffrey 提到为什么不生成 callvirt 的原因是因为在这种情况下 ToString() 将被递归调用并会导致 StackOverFlow 异常,我试图理解但无法理解这个想法?谁能解释为什么它会导致递归调用?
谢谢..