入れ子にされた型 (C# プログラミング ガイド)

クラス構造体インターフェイスの中で定義された型は、入れ子にされた型と呼ばれます。 次に例を示します。

public class Container
{
    class Nested
    {
        Nested() { }
    }
}

外側の型がクラス、構造体、入れ子にされた型のいずれであっても、入れ子にされた型は既定で private になり、それが含まれる型からのみアクセスできます。 前の例では、Nested クラスは外部の型にアクセスできません。

次のように、アクセス修飾子を指定して、入れ子にされた型のアクセシビリティを定義することもできます。

  • クラスの入れ子にされた型は、publicprotectedinternalprotected internalprivateprivate protected になります。

    ただし、シール クラス内で protectedprotected internalprivate protected の入れ子にされたクラスを定義すると、コンパイラの警告 CS0628、"新規のプロテクト メンバーがシール クラスで宣言されました" が生成されます。

    また、入れ子になった型を外部から参照できるようにすることは、コード品質ルール CA1034 の "入れ子にされた型を参照可能にすることはできません" に違反することにもご注意ください。

  • 構造体の入れ子にされた型は、は、publicinternal、または private のいずれかが可能です。

次の例では、Nested クラスを public にします。

public class Container
{
    public class Nested
    {
        Nested() { }
    }
}

入れ子にされた型 (内側の型) は、包含する型 (外側の型) にアクセスできます。 包含する型にアクセスするには、その型を引数として入れ子にされた型のコンストラクターに渡します。 次に例を示します。

public class Container
{
    public class Nested
    {
        private Container? parent;

        public Nested()
        {
        }
        public Nested(Container parent)
        {
            this.parent = parent;
        }
    }
}

入れ子にされた型は、包含する型にアクセス可能なすべてのメンバーにアクセスできます。 入れ子にされた型は、継承されたプロテクト メンバーを含む、包含する型のプライベート メンバーとプロテクト メンバーにアクセスできます。

上記の宣言では、クラス Nested の完全名は Container.Nested です。 これは、次のように入れ子になったクラスの新しいインスタンスを作成するときに使用される名前です。

Container.Nested nest = new Container.Nested();

関連項目