У вас есть 2 основных варианта реализации интерфейсов: неявный или явный.Неявная реализация принимает форму открытого метода или свойства, тогда как явная - в форме метода или свойства, которому предшествует модификатор IFoo.
, который в противном случае не является общедоступным.
interface IFoo
{
void Bar();
}
class FooA : IFoo
{
public void Bar() { }
}
class FooB : IFoo
{
void IFoo.Bar() { }
}
Разница здесьчто в случае FooA
, void Bar
является частью публично видимого API класса.Код может вызвать Bar
через экземпляр класса.
FooA foo = new FooA();
foo.Bar(); // legal
В случае FooB
, void Bar
является , а не частью публично видимого API класса,Метод по-прежнему можно вызывать, но он должен явно вызываться через интерфейс.
FooB foo = new FooB();
foo.Bar(); // not legal
IFoo myFoo = foo;
myFoo.Bar(); // legal
Ваш код не компилируется, поскольку он переходит в неизведанные области между неявной и явной реализацией интерфейса.Вы видели, что с вашим изменением вы юридически определили явную реализацию, поэтому эта конкретная версия компилируется.В противном случае вы также обнаружили, что модификатор public
необходим для компиляции неявной версии.