Мой вопрос несколько связан с этим: Как общее ограничение предотвращает бокс типа значения с неявно реализованным интерфейсом?, но отличается тем, что он должен" t нужно ограничение для этого, потому что оно не является общим вообще.
У меня есть код
interface I { void F(); }
struct C : I { void I.F() {} }
static class P {
static void Main()
{
C x;
((I)x).F();
}
}
Основной метод заключается в следующем:
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.