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

c# inheritance constructor compiler-errors

98199 просмотра

6 ответа

Мой код

public class Parent
{

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

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

}

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

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

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

Автор: Kuntady Nithesh Источник Размещён: 13.11.2019 11:31

Ответы (6)


202 плюса

Решение

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

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

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

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

protected Parent() { } 
Автор: dlev Размещён: 29.08.2011 01:13

34 плюса

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

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

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

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

Автор: AndrewC Размещён: 29.08.2011 01:14

18 плюса

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

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

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

Автор: Daniel Hilgarth Размещён: 29.08.2011 01:13

11 плюса

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

public class child : parent {
    public child(int i) : base(i) {
        Console.WriteLine("child");
    }
}
Автор: Hans Passant Размещён: 29.08.2011 01:14

0 плюса

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

public parent() { } 
Автор: Alin Размещён: 08.04.2015 08:53

0 плюса

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

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

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

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

Автор: NCA Размещён: 14.04.2015 06:29
Вопросы из категории :
32x32