为什么实现内部接口的方法必须公开

时间:2012-06-22 18:48:46

标签: c# c#-4.0

我正在开发一个实现内部接口的内部类。 任何人都可以解释为什么我不能将我的方法声明为内部,为什么我收到以下错误:“无法实现接口成员,因为它不公开”。

我知道我必须将该方法声明为公开,但这对我来说绝对没有意义。

如果接口和类都是内部的,那么声明方法是公共的有什么意义? 这不是误导吗?

我看过a related question on this site。这不完全是重复的,因为我的班级是内部的。

2 个答案:

答案 0 :(得分:11)

简单地说:因为这是语言设计者设计它的方式。即使在内部接口中,这些方法也是隐式公开的。它确实使事情变得简单,但在其他方面却是一种痛苦。

如果你想要一个你想“隐藏”内部接口使用的公共类,你可以使用显式接口实现 - 虽然这有其他缺点。

当然,如果你的类是内部的,那么方法是公共的并不重要 - 其他程序集也无法调用方法,因为它们看不到类型。

我绝对同意C#(或一般的.NET)的设计并不像内部接口那样谨慎。

完全而言,您收到错误消息的原因 - C#4规范(接口映射)的第13.4.4节是原因。只有非静态公共成员和显式接口成员实现才能找到实现 - 如果接口中有任何未实现的成员,则会发生错误。

答案 1 :(得分:0)

我知道这很老了,但也许有人觉得有用。您可以完成一种内部接口方法,如下所示:

internal interface IFoo
{
    void MyMethod();
}

public abstract class Foo : IFoo
{
    void IFoo.MyMethod()
    {
        MyMethod();
    }

    internal abstract void MyMethod();
}

因此,所有内部类都应从Foo派生,并被强制实现抽象的MyMethod。但是您当然可以将它们全部视为IFoo。但是程序集之外的那些类将不提供MyMethod类。

因此,您可以在内部将类视为IFoo并依赖MyMethod。缺点是您所有的类都需要从Foo派生,如果您需要另一个基类,这可能是个问题。

但是,我发现如果抽象基类是泛型基类而不是接口,则将很有帮助。也许在某些情况下有用。