我的代码是
public class Parent
{
public Parent(int i)
{
Console.WriteLine("parent");
}
}
public class Child : Parent
{
public Child(int i)
{
Console.WriteLine("child");
}
}
我收到错误:
Parent不包含带0个参数的构造函数。
我理解问题是Parent
没有带0参数的构造函数。但我的问题是,为什么我们需要一个零参数的构造函数?如果没有它,为什么代码不起作用?
答案 0 :(得分:201)
由于您没有显式调用父构造函数作为子类构造函数的一部分,因此会对插入的无参数父构造函数进行隐式调用。该构造函数不存在,因此您得到了该错误。
要纠正这种情况,您需要添加一个显式调用:
public Child(int i) : base(i)
{
Console.WriteLine("child");
}
或者,您可以添加无参数的父构造函数:
protected Parent() { }
答案 1 :(得分:34)
您需要将孩子的构造函数更改为:
public child(int i) : base(i)
{
// etc...
}
您收到错误是因为您的父类的构造函数接受了一个参数,但您没有将该参数从子级传递给父级。
构造函数不是在C#中继承的,你必须手动链接它们。
答案 2 :(得分:18)
您需要将child
类的构造函数更改为:
public child(int i) : base(i)
{
Console.WriteLine("child");
}
部分: base(i)
表示应该使用具有一个int
参数的基类的构造函数。如果缺少这个,则隐式告诉编译器使用没有参数的默认构造函数。因为基类中不存在这样的构造函数,所以它会给你这个错误。
答案 3 :(得分:11)
编译器无法猜测应该为基础构造函数参数传递什么。你必须明确地做到这一点:
public class child : parent {
public child(int i) : base(i) {
Console.WriteLine("child");
}
}
答案 4 :(得分:0)
您可以在Parent类中使用不带参数的构造函数:
public parent() { }
答案 5 :(得分:0)
默认情况下,编译器尝试调用基类的无参数构造函数。
如果基类没有无参数构造函数,则必须自己显式调用它:
public child(int i) : base(i){
Console.WriteLine("child");}