编译错误 · error CS1729

"X"不包含采用 N 个参数的构造器

你的 new X(…) 调用和类声明的任何构造器都对不上。十有八九成因相同:只要写了任何构造器,C# 就收回免费的无参构造器——原来的 new X() 就坏了。

亲眼看它发生

class Person
{
    public Person(string name)
    {
        Console.WriteLine("created " + name);
    }
}

Person p = new Person();     // CS1729: 现在只有 (string) 构造器了

修法一:把构造器要的东西传进去

class Person
{
    public Person(string name)
    {
        Console.WriteLine("created " + name);
    }
}

Person p = new Person("Ada");

修法二:把空构造器加回来

如果 new Person() 确实是合法的——数据由对象初始化器来填——就在旁边声明一个无参构造器:

class Person
{
    public string Name { get; set; }

    public Person() { }                  // 显式的空构造器
    public Person(string name) { Name = name; }
}

Person p = new Person { Name = "Ada" };  // 又能用了
Console.WriteLine(p.Name);

C# 为什么这样设计

免费的无参构造器是给"没有任何初始化需求"的类的便利。当你声明 Person(string name),你是在宣称:"一个 Person 没有名字就不合法"——于是 C# 好心收走了那个会造出非法对象的构造器。这个错误是语言在执行你自己的规定。

构造器可以像方法一样重载(规则同族,见 CS1501/CS7036)——而且在继承里,子类构造器必须用 : base(…) 把参数递给父类:

class Student : Person
{
    public Student(string name, int grade) : base(name)   // 喂给父类
    {
        // ...
    }
}

常见问答

C# 里的 CS1729 是什么意思?

new X(...) 与类声明的任何构造器都不匹配。最常见成因:写了任何构造器后免费的无参构造器消失。修法:传参,或补一个显式空构造器。

为什么加了构造器后 new X() 就坏了?

无参构造器只在类没有任何构造器时存在。写了 Person(string name) 之后,C# 认为无名 Person 不该合法,收回了 new Person()——重新显式声明即可恢复。

排查清单