web-dev-qa-db-de.com

C # Fehler: Parent enthält keinen Konstruktor, der Argumente akzeptiert

Mein Code lautet

public class Parent
{

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

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

}

Ich erhalte den Fehler:

Parent enthält keinen Konstruktor, der 0 Argumente akzeptiert.

Ich verstehe das Problem ist, dass Parent keinen Konstruktor mit 0 Argumenten hat. Aber meine Frage ist, warum brauchen wir einen Konstruktor mit null Argumenten? Warum funktioniert der Code nicht ohne?

136
Kuntady Nithesh

Da Sie einen übergeordneten Konstruktor nicht explizit als Teil Ihres untergeordneten Klassenkonstruktors aufrufen, wird implizit ein übergeordneter Konstruktor ohne Parameter eingefügt. Dieser Konstruktor ist nicht vorhanden, und Sie erhalten diesen Fehler.

Um die Situation zu korrigieren, müssen Sie einen expliziten Aufruf hinzufügen:

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

Oder Sie können einfach einen parameterlosen übergeordneten Konstruktor hinzufügen:

protected Parent() { } 
199
dlev

Sie müssen den Konstruktor Ihres Kindes folgendermaßen ändern:

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

Sie haben den Fehler erhalten, da der Konstruktor Ihrer übergeordneten Klasse einen Parameter übernimmt, Sie diesen Parameter jedoch nicht vom untergeordneten an den übergeordneten Parameter übergeben. 

Konstruktoren werden nicht in C # vererbt, sondern müssen manuell verkettet werden.

34
AndrewC

Sie müssen den Konstruktor der child-Klasse folgendermaßen ändern:

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

Der Teil : base(i) bedeutet, dass der Konstruktor der Basisklasse mit einem int-Parameter verwendet werden soll. Wenn dies fehlt, weisen Sie den Compiler implizit an, den Standardkonstruktor ohne Parameter zu verwenden. Da in der Basisklasse kein solcher Konstruktor vorhanden ist, wird dieser Fehler angezeigt.

18
Daniel Hilgarth

Der Compiler kann nicht erraten, was für das Basiskonstruktorargument übergeben werden soll. Du musst es explizit tun:

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

Standardmäßig versucht der Compiler, den parameterlosen Konstruktor der Basisklasse aufzurufen. 

Wenn die Basisklasse keinen parameterlosen Konstruktor hat, müssen Sie ihn explizit selbst aufrufen:

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

Ref: Konstruktoraufrufhierarchie während der Vererbung

0
NCA

Sie können einen Konstruktor ohne Parameter in Ihrer Parent-Klasse verwenden: 

public parent() { } 
0
Alin