編譯錯誤 · 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()——重新顯式宣告即可恢復。

排查清單