Afaik,在 C# 中,任何从接口实现的方法都必须是公共的。
interface A { void DoA(); }
class B : A { public void DoA() {} }
但是如果你继承了一个继承自另一个接口的接口,那么你可以将基接口方法标记为private。
interface A1 { void DoA1(); }
interface A2 : A1 { void DoA2(); }
class B : A2
{
public void DoA2() { } // Still need to be marked as public
void A1.DoA1() { } // Can be marked as private
// or I can do this: public void DoA1() { }
}
当我看到一个班级
class MyClass : IEnumerable<SomeType>
正是这样做时,我首先注意到了这一点。
public IEnumerator<MyType> GetEnumerator() { ... }
private IEnumerator IEnumerable.GetEnumerator() { ... }
为什么允许这样做?为什么我可以将
B
的实例传递给采用 A1
的方法,即使 DoA1
是私有的?我找不到任何关于此的文档。
void A1.DoA1() { }
没有将方法标记为私有,它是一个 显式接口实现:
显式接口实现没有访问修饰符,因为它不能作为定义它的类型的成员访问。相反,它只能在通过接口实例调用时访问。如果为显式接口实现指定访问修饰符,则会出现编译器错误 CS0106。