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

时间:2011-02-11 06:29:13

标签: c# class constructor

这不会编译:

namespace Constructor0Args
{
    class Base
    {
        public Base(int x)
        {
        }
    }

    class Derived : Base
    {
    }

    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

相反,我收到以下错误:

  

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

为什么?基类是否需要具有带0参数的构造函数?

4 个答案:

答案 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)
        {
        }
    }