Tipos aninhados (Guia de Programação em C#)

Um tipo definido em uma classe, um struct ou uma interface é chamado de tipo aninhado. Por exemplo

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

Independentemente de o tipo externo ser uma classe, uma interface ou uma struct, os tipos aninhados são privados por padrão, acessíveis somente por meio do tipo que contêm. No exemplo anterior, a classe Nested é inacessível para tipos externos.

Você também pode especificar um modificador de acesso para definir a acessibilidade de um tipo aninhado, da seguinte maneira:

O exemplo a seguir torna a classe Nested pública:

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

O tipo aninhado ou interno pode acessar o tipo recipiente ou externo. Para acessar o tipo recipiente, passe-o como um argumento ao construtor do tipo aninhado. Por exemplo:

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

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

Um tipo aninhado tem acesso a todos os membros acessíveis ao seu tipo recipiente. Ele pode acessar membros privados e protegidos do tipo recipiente, incluindo quaisquer membros protegidos herdados.

Na declaração anterior, o nome completo da classe Nested é Container.Nested. Este é o nome usado para criar uma nova instância da classe aninhada, da seguinte maneira:

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

Confira também