为什么接口的显式实现不能公开?


75

我在Class中有实现接口的方法。当我实现显式实现时,出现编译器错误

The modifier 'public' is not valid for this item

为什么不允许public显式接口实现?

Answers:


70

显式接口实现的原因是避免名称冲突,最终结果是在调用这些方法之前必须将对象显式转换为该接口。

您可以认为这些方法不是在类上公开的,而是直接与接口绑定的。没有必要指定public / private / protected,因为接口不能具有非public成员,所以它将始终是public。

(Microsoft概述了显式接口的实现


3
对于隐式接口,也不需要将其指定为公共的,但允许这样做,实际上它必须这样做。因此,暗示公共逻辑的接口并不能真正解释我要说的原始问题。
liang

对于隐式接口,该方法只是可以是私有的方法。单独的签名使其成为接口方法的实现。显式接口定义只能是公共的。我明白您的意思,但是TBH允许公开使用隐式方法可能只是与编译器执行操作的顺序有关。
理查德·萨雷

3
"...since it will always be public..."; 从技术上讲这是不正确的,因为在将对象强制转换为接口之前,无法从外部调用显式实现的函数。
Massood Khaari

@Massood-他们的可发现性与可访问性无关。成员肯定是公开的,因为它们可以从不相关的类访问,而不仅是从声明类(私有),派生类(受保护的)或程序集(内部)访问
Richard

11
这与“公共”的定义有关。我检查了C#语言规范。在第13.4.1节的第392页中,它说:"Explicit interface member implementations have different accessibility characteristics than other members. Because explicit interface member implementations are never accessible through their fully qualified name in a method invocation or a property access, they are in a sense private. However, since they can be accessed through an interface instance, they are in a sense also public."
Massood Khaari

27

显式成员实现允许对具有相同签名的接口成员进行歧义消除。

如果没有显式的接口成员实现,则类或结构将不可能具有具有相同签名和返回类型的接口成员的不同实现。

为什么接口的显式实现不能公开?当成员被显式实现时,不能通过类实例进行访问,而只能通过接口的实例进行访问。

public interface IPrinter
{
   void Print();
}
public interface IScreen
{
   void Print();
}

public class Document : IScreen,IPrinter
{
    void IScreen.Print() { ...}
    void IPrinter.Print() { ...} 
}

.....
Document d=new Document();
IScreen i=d;
IPrinter p=d;
i.Print();
p.Print();
.....

显式接口成员的实现不能通过类或结构实例进行访问。


9
大多数人不同意你的看法?考虑到这就是存在显式接口实现的原因,我很难相信。msdn.microsoft.com/zh-CN/library/ms173157.aspx
Richard Szalay,2009年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.