it-swarm.com.ru

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

Мой код

public class Parent
{

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

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

}

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

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

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

136
Kuntady Nithesh

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

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

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

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

protected Parent() { } 
199
dlev

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

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

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

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

34
AndrewC

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

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

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

18
Daniel Hilgarth

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

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

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

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

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

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

0
NCA

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

public parent() { } 
0
Alin