Ошибка C #: родитель не содержит конструктор, который принимает 0 аргументов - PullRequest
140 голосов
/ 29 августа 2011

Мой код:

public class Parent
{

    public Parent(int i)
    {
        Console.WriteLine("parent");
    }
}

public class Child : Parent
{
    public Child(int i)
    {
        Console.WriteLine("child");
    }

}

Я получаю сообщение об ошибке:

Родитель не содержит конструктор, который принимает 0 аргументов.

Я понимаю, что проблема в том, что Parent не имеет конструктора с 0 аргументами.Но мой вопрос: зачем нам конструктор с нулевыми аргументами?Почему код не работает без него?

Ответы [ 6 ]

202 голосов
/ 29 августа 2011

Поскольку вы явно не вызываете родительский конструктор как часть вашего дочернего конструктора класса, существует неявный вызов вставленного родительского конструктора без параметров. Этот конструктор не существует, и вы получаете эту ошибку.

Чтобы исправить ситуацию, нужно добавить явный вызов:

public Child(int i) : base(i)
{
    Console.WriteLine("child");
}

Или вы можете просто добавить родительский конструктор без параметров:

protected Parent() { } 
34 голосов
/ 29 августа 2011

Вам нужно изменить конструктор вашего ребенка на:

public child(int i) : base(i)
{
    // etc...
}

Вы получили ошибку, потому что конструктор вашего родительского класса принимает параметр, но вы не передаете этот параметр от дочернего к родительскому.

Конструкторы не наследуются в C #, их нужно связывать вручную.

18 голосов
/ 29 августа 2011

Вам необходимо изменить конструктор класса child следующим образом:

public child(int i) : base(i)
{
    Console.WriteLine("child");
}

Часть : base(i) означает, что должен использоваться конструктор базового класса с одним параметром int.Если это отсутствует, вы неявно указываете компилятору использовать конструктор по умолчанию без параметров.Поскольку в базовом классе такого конструктора не существует, он выдает эту ошибку.

11 голосов
/ 29 августа 2011

Компилятор не может угадать, что следует передать для аргумента базового конструктора.Вы должны сделать это явно:

public class child : parent {
    public child(int i) : base(i) {
        Console.WriteLine("child");
    }
}
0 голосов
/ 14 апреля 2015

По умолчанию компилятор пытается вызвать беспараметрический конструктор базового класса.

В случае, если базовый класс не имеет конструктора без параметров, вы должны явно вызвать его самостоятельно:

public child(int i) : base(i){
Console.WriteLine("child");}

Ref: Конструктор, вызывающий иерархию во время наследования

0 голосов
/ 08 апреля 2015

Вы можете использовать конструктор без параметров в родительском классе:

public parent() { } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...