На самом деле есть действительно веская причина для такого поведения.Рассмотрим следующий код.
public interface IA
{
IA DoSomething();
}
public interface IB
{
IB DoSomething();
}
public class Test : IA, IB
{
public IA DoSomething() { return this; }
IA IA.DoSomething() { return this; }
IB IB.DoSomething() { return this; }
}
В этом сценарии класс Test
должен явно реализовывать хотя бы один из методов DoSomething
, поскольку недопустимо объявлять два разных метода с одинаковой сигнатурой.Если бы вы изучили IL, вы бы увидели, что явная реализация интерфейса украшает имя члена автоматически, так что в одном и том же классе не существует двух членов с одинаковым именем.И чтобы иметь возможность вызывать каждую из 3 различных DoSomething
вариаций, описанных выше, вы должны вызывать элемент из ссылки правильного типа.Вот как компилятор знает, как связать правильный член.
public static void Main()
{
var test = new Test();
test.DoSomething(); // Compiler binds to the implicit implementation.
var a = (IA)test;
a.DoSomething(); // Compiler binds to the IA implementation.
var b = (IB)test;
b.DoSomething(); // Compiler binds to the IB implementation.
}