IL предлагает два оператора для вызова функций, т.е. call и callvirt. Вызов используется для вызова не виртуальных или статических функций или любой функции, в которой компилятор не хочет выполнять нулевую проверку ссылки.
callvirt используется для вызова виртуальных функций, также вызываются не виртуальные функции, так как компилятор выполняет нулевую проверку ссылки во время выполнения.
Теперь, проходя через CLR через C #, я нашел следующий пример.
internal class SomeClass
{
public override String ToString()
{
return base.ToString();
}
}
Теперь ToString () является виртуальной функцией, но компилятор генерирует для нее инструкцию вызова, и это нормально. Но причина, по которой Джеффри упомянул, почему callvirt не генерируется, потому что в этом случае ToString () будет вызываться рекурсивно и вызовет StackOverFlow Exception, я пытался понять, но не смог обдумать эту идею? Может кто-нибудь объяснить, почему это вызовет рекурсивный вызов?
спасибо ..