这不会编译:
namespace Constructor0Args
{
class Base
{
public Base(int x)
{
}
}
class Derived : Base
{
}
class Program
{
static void Main(string[] args)
{
}
}
}
相反,我收到以下错误:
'Constructor0Args.Base'不包含带0参数的构造函数
为什么?基类是否需要具有带0参数的构造函数?
答案 0 :(得分:29)
不是 - 问题是它需要调用某些基础构造函数,以便初始化基类型和默认是致电base()
。您可以通过在derived-types构造函数中自己指定特定的构造函数(和参数)来调整它:
class Derived : Base
{
public Derived() : base(123) {}
}
对于base
(或者this
)构造函数的参数,您可以使用:
例如,以下也有效,使用上述所有三个项目符号:
class Derived : Base
{
public Derived(string s) : base(int.Parse(s, NumberStyles.Any)) {}
}
答案 1 :(得分:13)
从另一个派生类时,将在派生类构造函数之前调用基类。当您没有显式调用构造函数时,您实际上是在编写
class Derived : Base
{
public Derived() : base()
{
}
}
由于Base类没有0参数构造函数,因此无效。
答案 2 :(得分:7)
如果没有为类明确定义构造函数,则会自动定义默认构造函数,如下所示:
public Derived() : base()
{
}
您需要在基类上指定构造函数以及传递给它的参数:
public Derived() : base(1)
{
}
答案 3 :(得分:0)
这是因为当实例化子类时,它还将实例化基类。默认情况下,它会尝试查找arg less构造函数。这适用于此代码:
class Base
{
public Base(int x) { }
}
class Derived : Base
{
public Derived(int x)
: base(x)
{
}
}