Ошибка C#: родитель не содержит конструктор, который принимает 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 аргументами. Но мой вопрос: зачем нам конструктор с нулевыми аргументами? Почему код не работает без него?

6 ответов

Решение

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

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

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

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

protected Parent() { } 

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

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

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

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

Вам нужно изменить конструктор child класс к этому:

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

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

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

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

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

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

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

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

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

public parent() { } 
Другие вопросы по тегам