IL は、関数を呼び出すための 2 つのステートメント、つまり call と callvirt を提供します。Call は、非仮想関数または静的関数、またはコンパイラが参照に対して null チェックを実行したくない関数を呼び出すために使用されます。
callvirt は仮想関数を呼び出すために使用されます。コンパイラは実行時に参照に対して null チェックを行うため、非仮想関数も呼び出されます。
C#経由でCLRを調べているときに、次の例が見つかりました。
internal class SomeClass
{
public override String ToString()
{
return base.ToString();
}
}
現在、ToString() は仮想関数ですが、コンパイラはそれに対する呼び出し命令を生成しますが、Jeffrey が callvirt が生成されない理由について言及した理由は、その場合、ToString() が再帰的に呼び出され、StackOverFlow 例外が発生するためです。私は理解しようとしましたが、この考えを理解することができませんでした? 再帰呼び出しが発生する理由を誰か説明できますか?
ありがとう..