編譯錯誤 · 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(…)把必需引數路由給父類。