なぜこれが起こっているのか知りたいです。以下のコード例と、各セクションの下のコメントで発行された対応する 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し、2 番目のセクションでは を出力したのはなぜですか? callvirtコンパイラが非仮想メソッドの命令を発行する理由はありますか? また、コンパイラがcallvirt非仮想メソッドに対して a を発行する場合がある場合、これは型安全性の問題を引き起こしますか?