web-dev-qa-db-fra.com

Erreur C #: le parent ne contient pas de constructeur prenant des arguments

Mon code est

public class Parent
{

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

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

}

Je reçois l'erreur:

Parent ne contient pas de constructeur qui prend 0 argument.

Je comprends que le problème est que Parent n’a pas de constructeur avec 0 argument. Mais ma question est la suivante: pourquoi avons-nous besoin d’un constructeur sans arguments? Pourquoi le code ne fonctionne-t-il pas sans cela?

136
Kuntady Nithesh

Puisque vous n'appelez pas explicitement un constructeur parent en tant que partie de votre constructeur de classe enfant, un appel implicite à un constructeur parent sans paramètre est inséré. Ce constructeur n'existe pas et vous obtenez donc cette erreur.

Pour corriger la situation, vous devez ajouter un appel explicite:

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

Ou, vous pouvez simplement ajouter un constructeur parent sans paramètre:

protected Parent() { } 
199
dlev

Vous devez changer le constructeur de votre enfant pour:

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

Vous obteniez l'erreur parce que le constructeur de votre classe parent accepte un paramètre mais vous ne le transmettez pas de l'enfant au parent. 

Les constructeurs ne sont pas hérités en C #, vous devez les chaîner manuellement.

34
AndrewC

Vous devez changer le constructeur de la classe child en ceci:

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

La partie : base(i) signifie que le constructeur de la classe de base avec un paramètre int doit être utilisé. Si cela manque, vous dites implicitement au compilateur d'utiliser le constructeur par défaut sans paramètres. Comme aucun constructeur de ce type n'existe dans la classe de base, il vous renvoie cette erreur.

18
Daniel Hilgarth

Le compilateur ne peut pas deviner ce qui devrait être passé pour l'argument du constructeur de base. Vous devez le faire explicitement:

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

Par défaut, le compilateur essaie d'appeler le constructeur sans paramètre de la classe de base. 

Si la classe de base n’a pas de constructeur sans paramètre, vous devez l’appeler explicitement vous-même:

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

Réf: Hiérarchie d’appel du constructeur pendant l’héritage

0
NCA

Vous pouvez utiliser un constructeur sans paramètre dans votre classe parent: 

public parent() { } 
0
Alin