[C#] C#錯誤:父類不包含一個構造函數,它需要0個參數


Answers

由於您沒有顯式調用父構造函數作為子類構造函數的一部分,因此會隱式調用插入的無參數父構造函數。 該構造函數不存在,所以你會得到這個錯誤。

要糾正這種情況,您需要添加一個明確的調用:

public Child(int i) : base(i)
{
    Console.WriteLine("child");
}

或者,您可以添加一個無參數的父構造函數:

protected Parent() { } 
Question

我的代碼是

public class Parent
{

    public Parent(int i)
    {
        Console.WriteLine("parent");
    }
}

public class Child : Parent
{
    public Child(int i)
    {
        Console.WriteLine("child");
    }

}

我收到錯誤:

父母不包含帶有0個參數的構造函數。

我明白問題是Parent沒有帶0參數的構造函數。 但我的問題是,為什麼我們需要一個具有零參數的構造函數? 為什麼沒有它的代碼工作?




您可以在父類中使用不帶參數的構造函數:

public parent() { } 



您需要將child類的構造函數更改為:

public child(int i) : base(i)
{
    Console.WriteLine("child");
}

部分: base(i)意味著應該使用帶有一個int參數的基類的構造函數。 如果缺少這個,你隱式地告訴編譯器使用沒有參數的默認構造函數。 因為在基類中不存在這樣的構造函數,所以它會給你這個錯誤。




編譯器無法猜測應該傳遞給基礎構造函數參數的內容。 你必須明確地做到這一點:

public class child : parent {
    public child(int i) : base(i) {
        Console.WriteLine("child");
    }
}



默認情況下編譯器會嘗試調用基類的無參數構造函數。

如果基類沒有無參數構造函數,則必須自己明確地調用它:

public child(int i) : base(i){
Console.WriteLine("child");}

參考: 構造函數在繼承期間調用層次結構




您需要將您的孩子的構造函數更改為:

public child(int i) : base(i)
{
    // etc...
}

你得到的錯誤是因為你父類的構造函數接受了一個參數,但是你沒有將該參數從子項傳遞給父項。

構造函數不是用C#繼承的,你必須手動鏈接它們。