Ошибка С#: родительский элемент не содержит конструктор, который принимает 0 аргументов

Мой код

public class Parent
{

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

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

}

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

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

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

Ответ 1

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

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

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

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

protected Parent() { } 

Ответ 2

Вам нужно изменить дочерний конструктор на:

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

public parent() { } 

Ответ 6

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

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

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

Ссылка: Иерархия вызовов конструктора во время наследования