C# 为什么实现内部接口的方法必须是公共的

C# 为什么实现内部接口的方法必须是公共的,c#,c#-4.0,C#,C# 4.0,我正在开发一个实现内部接口的内部类。 有人能解释为什么我不能将我的方法声明为内部方法,为什么我会出现以下错误:“无法实现接口成员,因为它不是公共的” 我知道我必须将该方法声明为public,但这对我来说毫无意义 如果接口和类都是内部的,那么将方法声明为公共有什么意义? 这不是误导吗 我读过。它不是一个完全相同的类,因为我的类是内部的。简单地说:因为这是语言设计者设计它的方式。即使在内部接口中,这些方法也是隐式公开的。它确实使事情变得简单,但在其他方面却令人痛苦 如果您想要一个公共类,其中您想要“

我正在开发一个实现内部接口的内部类。 有人能解释为什么我不能将我的方法声明为内部方法,为什么我会出现以下错误:“无法实现接口成员,因为它不是公共的”

我知道我必须将该方法声明为public,但这对我来说毫无意义

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


我读过。它不是一个完全相同的类,因为我的类是内部的。

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

如果您想要一个公共类,其中您想要“隐藏”内部接口的使用,那么您可以使用显式接口实现——尽管这还有其他缺点

当然,如果您的类是内部的,那么方法是否是公共的并不重要——其他程序集将无法调用这些方法,因为它们看不到类型

我完全同意C#(或一般的.NET)并没有像围绕内部接口那样精心设计


关于您收到错误消息的确切原因,C#4规范(接口映射)第13.4.4节就是原因。实现只适用于非静态公共成员和显式接口成员实现,如果接口中有任何未实现的成员,则会发生错误。

我知道这很旧,但可能有人发现它很有用。您可以实现如下一种内部接口方法:

内部接口IFoo
{
void MyMethod();
}
公共抽象类Foo:IFoo
{
void IFoo.MyMethod()
{
MyMethod();
}
内部抽象方法();
}
因此,您的所有内部类都应该从Foo派生,并被迫实现抽象的MyMethod。当然,你可以把它们都当作我的东西。但是那些程序集之外的类不会提供MyMethod类

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


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

为什么一个接口是内部的,或者不影响它作为接口的性质?@BoltClock我不希望任何东西是公开的。内部是一个更好的选择。Jon,你能解释一下你说的“它确实使事情变得简单,但在其他方面却很痛苦”是什么意思吗?@ArneLund:显式接口实现有时会产生令人惊讶的结果,并且使得很难/不可能在派生类中提供接口的新实现,该派生类首先调用基类中的现有接口。动态输入也会失败。非常感谢!我想知道为什么这种看似一致的行为被认为是非法的。你已经解释过,C#的设计并没有像它可能的那样仔细。对我来说有道理。周末愉快!