Error del compilador · error CS1729
'X' no contiene un constructor que tome N argumentos
Tu new X(…) no coincide con ningún constructor declarado. Nueve de cada diez veces la causa es la misma: en cuanto escribes CUALQUIER constructor, C# deja de ofrecer el constructor vacío — y los antiguos new X() se rompen.
Míralo ocurrir
class Persona
{
public Persona(string nombre)
{
Console.WriteLine("creada " + nombre);
}
}
Persona p = new Persona(); // CS1729: ahora solo existe el constructor (string)
Solución 1: pasa lo que el constructor pide
class Persona
{
public Persona(string nombre)
{
Console.WriteLine("creada " + nombre);
}
}
Persona p = new Persona("Ada");
Solución 2: recupera el constructor vacío
Si new Persona() es de verdad válido — los inicializadores de objeto rellenarán los datos — declara un constructor sin parámetros junto al otro:
class Persona
{
public string Nombre { get; set; }
public Persona() { } // constructor vacío explícito
public Persona(string nombre) { Nombre = nombre; }
}
Persona p = new Persona { Nombre = "Ada" }; // vuelve a funcionar
Console.WriteLine(p.Nombre);
Por qué C# funciona así
El constructor vacío gratuito es una comodidad para clases sin necesidades de inicialización. Cuando declaras Persona(string nombre), estás afirmando "una Persona sin nombre no es válida" — así que C# retira el constructor que crearía una inválida. El error es el lenguaje aplicando tu propia regla.
Los constructores se sobrecargan como los métodos (misma familia, CS1501/CS7036) — y en la herencia, el constructor del hijo debe pasar sus argumentos al padre con : base(…):
class Estudiante : Persona
{
public Estudiante(string nombre, int curso) : base(nombre) // alimenta al padre
{
// ...
}
}
Preguntas frecuentes
¿Qué significa CS1729?
new X(...) no coincide con ningún constructor declarado. Causa habitual: declarar un constructor elimina el vacío gratuito. Solución: pasa argumentos o añade un constructor vacío explícito.
¿Por qué new X() deja de funcionar?
El constructor vacío solo existe sin constructores declarados. Tras Persona(string nombre), C# retira new Persona(); vuelve a declararlo explícitamente si debe seguir siendo válido.
Lista de comprobación
- Lee la lista de parámetros del constructor; tu llamada debe coincidir exactamente con una.
- ¿Declaraste algún constructor? El vacío desapareció — vuélvelo a añadir si
new X()debe seguir siendo legal. - Los inicializadores de objeto (
new X { … }) no sustituyen a los argumentos del constructor — asignan propiedades después. - ¿Herencia? Envía los argumentos requeridos al padre con
: base(…).