Ошибка С#: родительский элемент не содержит конструктор, который принимает 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");}
Ссылка: Иерархия вызовов конструктора во время наследования