Почему я получаю ошибку «недоступен из-за уровня защиты»? - PullRequest
2 голосов
/ 16 марта 2011

Я получаю эту ошибку:

'CTest.A.A ()' недоступен из-за уровня защиты.

при компиляции этого кода:

public class A
{
    private A()
    {
    }
}

public class B : A
{
    public void SayHello()
    {
        Console.WriteLine("Hello");
    }
}

Может кто-нибудь объяснить, почему?

Ответы [ 5 ]

14 голосов
/ 16 марта 2011

Поскольку конструктор по умолчанию для A является личным, попробуйте protected A() {} в качестве конструктора.

Класс B автоматически вызывает конструктор по умолчанию A, если он недоступен для B или тамне является конструктором по умолчанию (если у вас есть конструктор protected A(string s) {}) B не может быть правильно создан.

Компилятор автоматически генерирует следующий конструктор по умолчанию в B

public B() : base()
{
}

Гдеbase() - это фактический вызов конструктора по умолчанию A.

4 голосов
/ 16 марта 2011

Конструктор класса B (который добавляется компилятором) должен вызывать конструктор по умолчанию (без аргументов) в A, однако конструктор по умолчанию помечается как private, что означает, что он может только вызываться внутри A, отсюда и ошибка.

Измените конструктор на A на protected или public, или internal, если B находится в той же сборке.

2 голосов
/ 16 марта 2011

Конструктор для A является закрытым, к нему нельзя получить доступ извне. Если вы хотите создать экземпляр A извне, сделайте конструктор открытым или защищенным.

1 голос
/ 16 марта 2011

Измените private A() на public A() и все готово.

0 голосов
/ 16 марта 2011

Это потому, что конструктор A является приватным, а конструктор B общедоступным. Когда вы создаете B (который также создает A), нет способа получить доступ к частному конструктору A.

...