Как реализуются явные реализации интерфейса в IL?
-
17-09-2020 - |
Вопрос
Я ознакомился с явными реализациями интерфейса в 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!
}
}
Если у вас есть два метода с одинаковой сигнатурой, которые вы хотите реализовать, вам нужно что-то, чтобы сделать их разными, чтобы вы могли предоставлять отдельные реализации.Это указано в названии интерфейса.