为什么接口不能包含类型?

Too*_*one 9 c#

这让我在C#中遇到过一两次.我可以写这样的代码

class Node
{
    class Connection
    {
        public Connection(Node node, string label)
        {
            this.Node = node;
            this.Label = label;
        }
        public Node Node { get; private set;  }
        public string Label { get; private set; }            
    };

    IEnumerable<Connection> IncomingConnections() // ...
    IEnumerable<Connection> OutgoingConnections() // ...
}
Run Code Online (Sandbox Code Playgroud)

但如果我写

interface INode
{
    class Connection
    {
        public Connection(INode node, string label)
        {
            this.Node = node;
            this.Label = label;
        }
        public INode Node { get; private set; }
        public string Label { get; private set; }
    };

    IEnumerable<Connection> IncomingConnections();
    IEnumerable<Connection> OutgoingConnections();
}
Run Code Online (Sandbox Code Playgroud)

我收到编译错误

错误CS0524:'连接':接口不能声明类型

我理解这个限制,但我感兴趣的是为什么.我当然可以在C++"接口"中使用嵌套类型(这只是一个具有抽象成员的类,所以毫不奇怪),显然它也可以在Java中看到接口无法声明类型问题C#.因此,考虑到C#从Java中学到了一些东西,为什么它在这方面缺乏(如果它确实缺乏)?

(如果这已经在其他地方得到解决,请道歉.我还发现Interfaces不能声明类型,为什么我不能在一个接口中放置一个委托?但它们似乎没有直接解决我的问题.)

编辑

我想我只是添加一个注释,说在Java世界中,乍一看似乎是一个悬而未决的问题,是否可以在接口中嵌套一个类.请参阅/sf/answers/636882501/.我不认为我为什么同样不适用于C#而感到愚蠢.

编辑

摘要/引自框架设计指南,2ed,第4.9节第115-117页.

  • 当嵌套类型需要访问封闭类型的私有成员时,请使用嵌套类型.
  • 不要使用公共嵌套类型进行分组; 为此使用名称空间.
  • 除非你真的知道自己在做什么,否则请避免使用公开嵌套的类型.(主要动机:显式创建嵌套类型对于技能较低的开发人员来说很困惑.但是,例如通过集合枚举器隐式创建是可以的.)
  • 如果嵌套类型将在包含类型之外使用或实例化,则不要使用嵌套类型(这两种类型都支持嵌套类型与包含类型的独立性).
  • 不要用作接口的成员.

Eri*_*ert 30

为什么接口不能包含类型?

在深入研究这个问题之前,请先澄清一些问题.

首先,CLR类型系统允许在接口内部嵌套类型.完全有可能创建一个C#或VB版本或明天支持在接口内声明的接口,委托,类,结构和枚举,并且它将在现有CLR上运行.

其次,我会给你一个关于"为什么C#语言没有实现X功能?"形式的问题的通常的回击.对于X的所有值,答案是相同的.为了实现,功能必须是:思考,设计,指定,实施,测试并运送给客户.如果这六件事中的任何一件没有发生那么就没有任何特征.功能X未实现,因为其中一个或多个事件未发生.

第三,C#编译器团队(我不再使用)不必为实现功能提供任何解释.特点是花钱,预算是有限的,因此要求该功能的人有责任证明其利益与其成本合理.

第四,"为什么"的问题很难回答,"为什么不"的问题更难解决.

所以,话虽如此,我会拒绝你的问题,并将其替换为我可以回答的问题:

假设已向C#设计团队提出此功能请求.你有什么理由反对它?

  • 该功能虽然在CLR中是合法的,但在CLS中是不合法的.C#中有许多功能在CLS中不合法,但由于CLS指南特别不在接口中嵌套类型,因为大多数语言都不支持它,因此在C#中实现该功能实质上是鼓励人们编写不能编写的库.用于其他语言.建议的功能鼓励编程错误.

  • 嵌套类型为您提供三个主要优势.首先,他们可以访问其封闭类型的私有成员.对于没有私有成员的接口,这不是一个好处.其次,它们提供了一种方便的方法来包含外部类型的特定私有实现细节.这对于接口来说并不是一个好处,因为接口可能没有私有嵌套类型,并且根据定义没有实现细节.第三,它们提供了将一种类型与另一种类型相关联的便捷方式; 但是,命名空间更好.

  • 据我所知,没有其他人要求该功能.当有很多客户需要的功能时,我们不会花钱购买几乎没有人想要的功能.

  • 实现该功能并不会使语言本身更强大或更具表现力.

  • 实现这个功能并不是我所知道的一些更棒的功能的垫脚石.该功能不与任何其他"主题"相关联.这是一个"完成主义"功能,消除了一个小的非正交性,而不是一个有用的功能.

  • 由于缺乏该功能,存在一种简单的解决方法; 只需使嵌套类型成为顶级类型即可.

这就是反对的情况.如果没有人推动的情况下,对于该功能,它不会在设计委员会会议上持续超过也许5分钟上衣.您是否愿意推进该功能的案例?