При использовании явной реализации интерфейса члены вынуждены использовать нечто более ограниченное, чем private в самом классе. И когда модификатор доступа принудительно, вы не можете добавить его.
Аналогично, в самом интерфейсе все члены public . Если вы попытаетесь добавить модификатор в интерфейс, вы получите похожую ошибку.
Почему явные члены (очень) закрытые? Рассмотрим:
interface I1 { void M(); }
interface I2 { void M(); }
class C : I1, I2
{
void I1.M() { ... }
void I2.M() { ... }
}
C c = new C();
c.M(); // Error, otherwise: which one?
(c as I1).M(); // Ok, no ambiguity.
Если бы эти методы были общедоступными, у вас было бы столкновение имен, которое не может быть разрешено обычными правилами перегрузки.
По той же причине вы даже не можете позвонить M()
изнутри class C
участника. Вам придется сначала привести this
к определенному интерфейсу, чтобы избежать такой же неоднозначности.
class C : I1, I2
{
...
void X()
{
M(); // error, which one?
((I1)this).M(); // OK
}
}