0

可能重复:
为什么接口的显式实现不能公开?

我读了这个问题。直接从问题

interface IRepository<T>
{
    void AddString();
}

interface IStringRepo : IRepository<string>
{
    List<string> GetStrings();
}

public class BLL : IStringRepo
{
    public List<string> FilterStrings()
    {
        return new List<string>() { "Hello", "World" };
    }

    public List<string> IStringRepo.GetStrings()
    {
        throw new NotImplementedException();
    }

    public void IRepository<string>.AddString()
    {
        throw new NotImplementedException();
    }
}

为什么公开明确引用的成员是一个Error

4

3 回答 3

1

为什么将显式引用的成员公开是一个错误

这是设计使然,想象一下迫使开发人员显式实现接口的最流行的原因之一:成员名称歧义,因此您有一个现有的类已经公开了具有某些名称的公共成员,并且您不能更改现有的类 API,因为它被其他系统使用,所以您不能更改接口 API(成员名称/签名),并且类和接口都定义了具有相同名称的成员,因此为public接口成员提供访问修饰符没有意义,因为成员具有已经在类中声明了相同的名称。

MSDN,13.4.1 显式接口成员实现

在方法调用、属性访问或索引器访问中,无法通过其完全限定名称访问显式接口成员实现。显式接口成员实现只能通过接口实例访问,并且在这种情况下仅通过其成员名称引用。

显式接口成员实现包含访问修饰符是编译时错误,包含修饰符 abstract、virtual、override 或 static 是编译时错误。

于 2012-04-15T17:39:58.117 回答
0

因为它们不公开,所以这是一种冲突

您必须choice以任何一种方式实现 - 显式或隐式。

如果是明确的,通常
是因为实施者希望强制您仅通过接口访问它,并且以某种方式对公众隐藏它(简化) - 因此它不是公开的。

简而言之,这是显式实现的目的之一。

于 2012-04-15T17:48:47.833 回答
-1

没有任何理由这样public,因为通过与它签订合同,您别无选择,然后像公众一样实施其所有成员。

但是为什么要报错呢?

原因很简单,根据定义,所有接口成员都是公共的。

接口

接口由方法、属性、事件、索引器或这四种成员类型的任意组合组成。接口不能包含常量、字段、运算符、实例构造函数、析构函数或类型。它不能包含静态成员。接口成员是自动公开的,它们不能包含任何访问修饰符。

于 2012-04-15T17:39:44.817 回答