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

Pra*_*dda 70 c# interface

我在Class中有方法,它是Interface的实现.当我做它显式实现时,我遇到了编译器错误

The modifier 'public' is not valid for this item
Run Code Online (Sandbox Code Playgroud)

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

Ric*_*lay 67

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

您可以认为这些方法不是在类上公开,而是直接绑定到接口.没有理由指定public/private/protected,因为它总是公开的,因为接口不能有非公共成员.

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

  • 这是"公共"定义的问题.我检查了[C#语言规范](https://www.microsoft.com/en-us/download/details.aspx?id=7029).在第13.4.1节,第392页中,它说:"显式接口成员实现具有与其他成员不同的可访问性特征.因为显式接口成员实现永远不能通过方法调用或属性访问中的完全限定名访问,所以它们在但是,由于它们可以通过接口实例访问,因此它们在某种意义上也是公开的."` (9认同)
  • 对于隐式接口,也没有必要指定为public,但是允许这样做,实际上它必须这样做.因此,暗示公共逻辑的界面并没有真正解释我所说的原始问题. (3认同)
  • `"......因为它永远是公开的......" 从技术上讲,这是不正确的,因为在将对象转换为接口之前,无法从外部调用显式实现的函数. (2认同)

ada*_*ost 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();
.....
Run Code Online (Sandbox Code Playgroud)

无法通过类或结构实例访问Explict接口成员实现.

  • 大多数人不同意你的意见?考虑到这就是存在显式接口实现的原因,我觉得很难相信.http://msdn.microsoft.com/en-us/library/ms173157.aspx (9认同)