これは、C# で 1 回か 2 回私を捕まえました。このようなコードを書くことができます
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() // ...
}
しかし、私が書くと
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();
}
コンパイルエラーが発生します
エラー CS0524: '接続': インターフェイスは型を宣言できません
制限は理解していますが、私が興味を持っているのは理由です。私は確かにC++の「インターフェース」(これは抽象メンバーを持つ単なるクラスであるため、当然のことです)でネストされた型を持つことができます.Javaでも可能であるようです.Interfaces Cannot Declare Type Issue C#を参照してください. C# が Java からいくつかのことを学んだことを考えると、なぜこの点が欠けているのでしょうか (実際に欠けているとすれば)。
(これがすでに他の場所で対処されている場合はお詫び申し上げます。Interfaces cannot declare typesとWhy can't I put a delegate in an interface?も見つかりましたが、私の質問に直接対処していないようです。)
編集
Java の世界では、インターフェイス内にクラスをネストしてもよいかどうかについて、一見未解決の問題のように思われるというメモを追加したいと思います。https://stackoverflow.com/a/9098321/834521を参照してください。同じことが C# に適用できない理由を尋ねるのはばかげているとは思いません。
編集
Framework Design Guidelines、第 2 版、セクション 4.9 pp115-117からの簡単な要約/引用。
- たとえば、ネストされた型が外側の型のプライベート メンバーにアクセスする必要がある場合は、ネストされた型を使用してください。
- グループ化に public のネストされた型を使用しないでください。これには名前空間を使用します。
- 自分が何をしているのか本当にわかっていない限り、パブリックにネストされた型は避けてください。(主な動機: ネストされた型を明示的に作成することは、スキルの低い開発者にとって混乱を招きます。ただし、コレクション列挙子などを介して暗黙的に作成することは問題ありません。)
- ネストされた型が含まれる型の外部で使用またはインスタンス化される場合は、ネストされた型を使用しないでください(これらは両方とも、ネストされた型が含まれる型から独立していることを主張しています)。
- インターフェイスのメンバーとして使用しないでください。