Мне любопытно узнать, почему это происходит. Пожалуйста, прочитайте приведенный ниже пример кода и соответствующий IL, который был издан в комментариях ниже каждого раздела:
using System;
class Program
{
static void Main()
{
Object o = new Object();
o.GetType();
// L_0001: newobj instance void [mscorlib]System.Object::.ctor()
// L_0006: stloc.0
// L_0007: ldloc.0
// L_0008: callvirt instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
new Object().GetType();
// L_000e: newobj instance void [mscorlib]System.Object::.ctor()
// L_0013: call instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
}
}
Почему компилятор выбрал callvirt
для первого раздела, но call
для второго раздела? Есть ли причина, по которой компилятор когда-либо выдавал инструкцию callvirt
для не виртуального метода? И если есть случаи, когда компилятор будет генерировать callvirt
для не виртуального метода, это создает проблемы безопасности типов?