为什么基类必须有一个带0参数的构造函数?

这不会编译:

namespace Constructor0Args { class Base { public Base(int x) { } } class Derived : Base { } class Program { static void Main(string[] args) { } } } 

相反,我收到以下错误:

‘Constructor0Args.Base’不包含带0参数的构造函数

这是为什么? 基类是否需要一个带0参数的构造函数?

不是 – 问题是它需要调用一些基础构造函数,以初始化基类型, 默认是调用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)) {} } 

从另一个派生类时,将在派生类构造函数之前调用基类。 当您没有显式调用构造函数时,您实际上是在编写

 class Derived : Base { public Derived() : base() { } } 

由于Base类没有0参数构造函数,因此无效。

如果没有为类显式定义构造函数,则会自动定义默认构造函数,如下所示:

 public Derived() : base() { } 

您需要在基类上指定构造函数以及传递给它的参数:

 public Derived() : base(1) { } 

这是因为当实例化子类时,它还将实例化基类。 默认情况下,它会尝试查找arg less构造函数。 这适用于此代码:

 class Base { public Base(int x) { } } class Derived : Base { public Derived(int x) : base(x) { } }