Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top