【问题标题】:C# Error: Parent does not contain a constructor that takes 0 argumentsC# 错误:Parent 不包含采用 0 个参数的构造函数
【发布时间】:2011-11-06 00:43:02
【问题描述】:

我的代码是

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 个参数的构造函数。但我的问题是,为什么我们需要一个零参数的构造函数?为什么没有它代码就不能工作?

【问题讨论】:

  • 在使用来自另一个程序集的内部构造函数扩展抽象类时,由于另一个原因,我收到了相同的错误消息。目前 DotNetCore 中的 TypeInfo、FieldInfo、...就是这种情况。只是想分享这些知识,因为我花了几个小时才解决它。

标签: c# inheritance constructor compiler-errors


【解决方案1】:

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

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

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

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

protected Parent() { } 

【讨论】:

  • 创建protected parent() { } 而不是public 可能是个好主意。
  • @Roberto 你能详细说明原因吗?
  • @JuanCarlosOropeza 基本原因是,到目前为止,不需要无参数的父构造函数,因此假设类的消费者不需要。因为我们真的只想要一个用于任何派生类,protected 是明智的修饰符,因为它具有“只有子类可以访问”的确切语义。
【解决方案2】:

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

public child(int i) : base(i)
{
    // etc...
}

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

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

【讨论】:

  • 吹毛求疵:他没有得到任何例外。这是他遇到的编译器错误
  • @DanielHilgarth 你在技术上是正确的,最好的一种正确。
  • guys 似乎在 .net Core FaultException 中缺少一个、两个和三个参数构造函数。想知道是否有人解决了问题。我正在将旧代码迁移到 .net 核心
【解决方案3】:

你需要把child类的构造函数改成这样:

public child(int i) : base(i)
{
    Console.WriteLine("child");
}

: base(i)部分表示应使用带有int参数的基类的构造函数。如果没有这个,你就隐含地告诉编译器使用没有参数的默认构造函数。因为基类中不存在这样的构造函数,所以会出现此错误。

【讨论】:

    【解决方案4】:

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

    public class child : parent {
        public child(int i) : base(i) {
            Console.WriteLine("child");
        }
    }
    

    【讨论】:

      【解决方案5】:

      您可以在父类中使用不带参数的构造函数:

      public parent() { } 
      

      【讨论】:

        【解决方案6】:

        默认情况下,编译器会尝试调用基类的无参数构造函数。

        如果基类没有无参数构造函数,你必须自己显式调用它:

        public child(int i) : base(i){
        Console.WriteLine("child");}
        

        参考:Constructor calling hierarchy during inheritance

        【讨论】:

          猜你喜欢
          • 2013-02-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多