なぜこれが起こっているのか知りたいです。以下のコード例と、各セクションの下のコメントで発行された対応する 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 を発行する場合がある場合、これは型安全性の問題を引き起こしますか?