Как реализованы явные реализации интерфейса в IL?

Я рассматривал явные реализации интерфейса в IL. Метод Method в следующем классе (интерфейс IA имеет один Method() на нем):

public class B : IA
    object IA.Method() {
        /* code */
    }
}

компилируется в следующую сигнатуру метода IL:

.method private hidebysig newslot virtual final instance object IA.Method() cil managed {
    .override IA::Method
    /* code */
}

Мой вопрос - почему имя метода в IL IA.Method(), а не просто Method? Что это на самом деле означает, и почему это не работает, если оно пропущено? Я ничего не могу найти в спецификации ECMA или в Google по этому поводу.


person thecoop    schedule 19.07.2010    source источник


Ответы (2)


Это потому, что таким образом вы можете иметь метод несколько раз.

public class B : IA
{
    object Method() {    }
    object IA.Method() {    }
}

Первый — обычный метод. Во-вторых, реализация интерфейса. Без префикса у вас не было бы обоих, потому что вы не могли бы различать их.

new B().Method(); // calls the normal method
((IA)new B()).Method(); // calls the IA interface method
person codymanix    schedule 19.07.2010
comment
Ааа, верно. Я не смог найти в спецификации, где определяется этот синтаксис/поведение. - person thecoop; 19.07.2010

Вот документация, которую вы ищете:
http://msdn.microsoft.com/en-us/library/ms173157.aspx

Причина этого заключается в том, чтобы обработать этот случай:

public class C : IA, IB
{
    object IA.Method()
    { 
        // Implementation!
    } 
    object IB.Method()
    { 
        // Implementation!
    } 
}

Если у вас есть два метода с одинаковой сигнатурой, которые вы хотите реализовать, вам нужно что-то, чтобы сделать их разными, чтобы вы могли предоставить отдельные реализации. Имя интерфейса обеспечивает это.

person Task    schedule 19.07.2010