В примере неясно, что явное объявление I2.Foo()
в самом интерфейсе будет выполнено, если это будет разрешено. Спецификация (с. 13.4.1) позволяет структуре или классу, реализующему интерфейс, объявлять явную реализацию члена. (Интерфейсы не могут объявлять какую-либо реализацию, явную или нет).
Итак, предположим, что мы определили:
interface IFoo
{
void Bar();
}
interface IBaz : IFoo
{
new void Bar();
}
interface IQux : IBaz { }
class A : IQux // equivalent to class A : IQux, IBaz, IFoo (spec sec. 13.4.6)
{
void IFoo.Bar()
{
Console.WriteLine("IFoo.Bar");
}
void IBaz.Bar()
{
Console.WriteLine("IBaz.Bar");
}
public void Bar()
{
Console.WriteLine("A.Bar");
}
// Not allowed: void IQux.Bar() {...}
// Since "The fully-qualified name of the interface member
// must reference the interface in which the member
// was declared" (s. 13.4.1)
}
Тогда следующий драйвер показывает эффект явной реализации метода интерфейса.
public static void Main()
{
A a = new A();
a.Bar(); // prints A.Bar
(a as IFoo).Bar(); // prints IFoo.Bar
(a as IBaz).Bar(); // prints IBaz.Bar
(a as IQux).Bar(); // prints IBaz.Bar
}