Как явные реализации интерфейса реализованы в IL? - PullRequest
2 голосов
/ 19 июля 2010

Я смотрел на явные реализации интерфейса в 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 об этом.

Ответы [ 2 ]

3 голосов
/ 19 июля 2010

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

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
2 голосов
/ 19 июля 2010

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

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

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

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

...