C#错误:Parent不包含带0参数的构造函数

Kun*_*esh 141 c# inheritance constructor compiler-errors

我的代码是

public class Parent
{

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

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

}
Run Code Online (Sandbox Code Playgroud)

我收到错误:

Parent不包含带0参数的构造函数.

我理解问题是Parent没有带0参数的构造函数.但我的问题是,为什么我们需要一个零参数的构造函数?没有它,为什么代码不工作?

dle*_*lev 202

由于您没有显式调用父构造函数作为子类构造函数的一部分,因此会对插入的无参数父构造函数进行隐式调用.该构造函数不存在,因此您得到该错误.

要纠正这种情况,您需要添加一个显式调用:

public Child(int i) : base(i)
{
    Console.WriteLine("child");
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以添加无参数的父构造函数:

protected Parent() { } 
Run Code Online (Sandbox Code Playgroud)

  • 创建一个`protected parent(){}`而不是`public`可能是一个好主意. (9认同)
  • @JuanCarlosOropeza基本原因是,到目前为止,不需要无参数的父构造函数,因此假设该类的消费者不需要一个.因为我们实际上只是为了任何派生类而想要一个,所以`protected`是明智的修饰符,因为它具有"只能访问子类"的确切语义. (3认同)

And*_*ewC 34

您需要将孩子的构造函数更改为:

public child(int i) : base(i)
{
    // etc...
}
Run Code Online (Sandbox Code Playgroud)

您收到错误是因为您的父类的构造函数接受了一个参数,但您没有将该参数从子项传递给父项.

构造函数不是在C#中继承的,您必须手动链接它们.

  • @DanielHilgarth你在技术上是正确的,最好的正确. (3认同)
  • "构造函数不是在C#中继承的"+1. (2认同)

Dan*_*rth 18

您需要将child类的构造函数更改为:

public child(int i) : base(i)
{
    Console.WriteLine("child");
}
Run Code Online (Sandbox Code Playgroud)

该部分: base(i)意味着int应该使用具有一个参数的基类的构造函数.如果缺少这个,则隐式告诉编译器使用没有参数的默认构造函数.因为基类中不存在这样的构造函数,所以它会给你这个错误.


Han*_*ant 11

编译器无法猜测应该为基础构造函数参数传递什么.你必须明确地做:

public class child : parent {
    public child(int i) : base(i) {
        Console.WriteLine("child");
    }
}
Run Code Online (Sandbox Code Playgroud)