编译错误 · 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()——重新显式声明即可恢复。
排查清单
- 读一遍构造器的参数表;你的实参数量必须精确匹配其中之一。
- 声明过任何构造器?空构造器没了——如果
new X()应当继续合法,显式加回来。 - 对象初始化器(
new X { … })替代不了构造器实参——它是构造之后设置属性。 - 继承场景?用
: base(…)把必需参数路由给父类。