私の質問はこれに多少関連しています:ジェネリック制約は、暗黙的に実装されたインターフェイスを使用した値型のボックス化をどのように防止しますか? 、しかし、これはまったく一般的ではないため、これを行うために制約を必要としないため、異なります。
私はコードを持っています
interface I { void F(); }
struct C : I { void I.F() {} }
static class P {
static void Main()
{
C x;
((I)x).F();
}
}
main メソッドは次のようにコンパイルされます。
IL_0000: ldloc.0
IL_0001: box C
IL_0006: callvirt instance void I::F()
IL_000b: ret
なぜこれにコンパイルされないのですか?
IL_0000: ldloca.s V_0
IL_0002: call instance void C::I.F()
IL_0007: ret
仮想呼び出しを行うためにメソッド テーブルが必要な理由はわかりますが、この場合は仮想呼び出しを行う必要はありません。インターフェイスが正常に実装されている場合、仮想呼び出しは行われません。
関連:明示的なインターフェイスの実装がプライベートなのはなぜですか? - この質問に対する既存の回答では、メソッドがメタデータで非公開としてマークされている理由を適切に説明していません (単に使用できない名前を持つのではなく)。しかし、これでもボックス化されている理由を完全には説明できません。なぜなら、C の内部から呼び出されたときにまだボックス化されているからです。