Error de C#: El padre no contiene un constructor que tome 0 argumentos


Mi código es

public class Parent
{

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

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

}

Estoy recibiendo el error:

El padre no contiene un constructor que tome 0 argumentos.

Entiendo que el problema es que Parent no tiene ningún constructor con 0 argumentos. Pero mi pregunta es, ¿por qué necesitamos un constructor con cero argumentos? ¿Por qué el código no funciona sin él?

Author: Jim Fell, 2011-08-29

6 answers

Dado que no invoca explícitamente un constructor padre como parte de su constructor de clase hijo, hay una llamada implícita a un constructor padre sin parámetros insertado. Ese constructor no existe, y así obtienes ese error.

Para corregir la situación, necesita agregar una llamada explícita:

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

O simplemente puede agregar un constructor padre sin parámetros:

protected Parent() { } 
 196
Author: dlev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-11 22:42:51

Necesita cambiar el constructor de su hijo a:

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

Estaba recibiendo el error porque el constructor de su clase padre toma un parámetro pero no está pasando ese parámetro del hijo al padre.

Los constructores no se heredan en C#, hay que encadenarlos manualmente.

 34
Author: AndrewC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-29 13:14:06

Necesitas cambiar el constructor de la clase child a esto:

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

La parte : base(i) significa que se debe usar el constructor de la clase base con un parámetro int. Si falta esto, le está diciendo implícitamente al compilador que use el constructor predeterminado sin parámetros. Debido a que no existe tal constructor en la clase base, le está dando este error.

 17
Author: Daniel Hilgarth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-29 13:13:33

El compilador no puede adivinar lo que se debe pasar para el argumento constructor base. Tienes que hacerlo explícitamente:

public class child : parent {
    public child(int i) : base(i) {
        Console.WriteLine("child");
    }
}
 11
Author: Hans Passant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-29 13:14:34

Puedes usar un constructor sin parámetros en tu clase padre:

public parent() { } 
 0
Author: Alin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-08 08:53:09

Por defecto el compilador intenta llamar al constructor sin parámetros de la clase base.

En caso de que la clase base no tenga un constructor sin parámetros, tienes que llamarlo explícitamente tú mismo:

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

Ref: Constructor llamando a la jerarquía durante la herencia

 0
Author: NCA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:08