【问题标题】:Class does not contain a constructor that takes 0 arguments [duplicate]类不包含带 0 个参数的构造函数 [重复]
【发布时间】:2014-04-14 19:14:55
【问题描述】:

我有这 2 个类,分别称为:MaliciousMaliciousSmall

恶意代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DataModel.MaliciousCode
{
    public class Malicious : MaliciousSmall
    {
    }
}

MaliciousSmall的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Data;
namespace DataModel.MaliciousCode
{
    public class MaliciousSmall
    {
        public int Id { get; set; }
        public int MaliciousCodeAlertId { get; set; }
        public string SourceId { get; set; }
        public int MalCodeID { get; set; }
        ......................................................
        ......................................................
        ......................................................

        // CONSTRUCTOR:

       public MaliciousSmall(DataRow row)
        {
            Id = int.Parse(row["Id"].ToString());

            MaliciousCodeAlertId = (row["MaliciousCodeAlertId"] is DBNull) ? MaliciousCodeAlertId = -1 : MaliciousCodeAlertId = int.Parse(row["MaliciousCodeAlertId"].ToString());
            SourceId = (row["SourceId"] is DBNull) ? SourceId = "" : SourceId = row["MaliciousCodeAlertId"].ToString();
            MalCodeID = (row["MalCodeID"] is DBNull) ? MalCodeID = -1 : MalCodeID = int.Parse(row["MalCodeID"].ToString());
            Title = (row["Title"] is DBNull) ? Title = "" : Title = row["Title"].ToString();

        ......................................................
        ......................................................
        ......................................................
        }

}

我的问题是,在我实现 MaliciousSmall 类之后,我在 Malicious 构造函数上收到以下错误:

错误 53“DataModel.MaliciousCode.MaliciousSmall”不包含 取 0 的构造函数 参数 C:\Develop\EarlyWarning\public\Implementazione\Ver2\DataModel\MaliciousCode\Malicious.cs 9 18 DataModel

我能做些什么来解决它?

我尝试创建一个以 DataRow 对象作为参数的空构造函数,类似于:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Data;

namespace DataModel.MaliciousCode
{
    public class Malicious : MaliciousSmall
    {

        public Malicious(DataRow row)
        {

        }
    }
}

但我仍然有同样的问题。我错过了什么?有什么办法可以解决?

【问题讨论】:

  • 你需要添加一个不带行的构造函数:public Malicious() { }
  • @GoranŠtuc:不,这行不通。看看继承。
  • 实际上,这个问题已经在 SO:hereherehere 上得到了多次回答。下次请先搜索。

标签: c# .net


【解决方案1】:

错误告诉您Malicious 构造函数在其基类 (MaliciousSmall) 中找不到合适的构造函数。

最初的问题是你的派生类构造函数隐式包含这个构造函数:

public Malicious() : base()
{
}

或者即使您添加了显式构造函数,它仍然试图链接到无参数的构造函数:

public Malicious(DataRow row) : base()
{
}

...但是没有在基类(MaliciousSmall)中没有这样的无参数构造函数,因此出现错误。

我认为你想链接到构造函数(你拥有MaliciousSmall中声明的那个):

public Malicious(DataRow row) : base(row)
{
}

假设您总是希望向构造函数提供一行。如果您确实希望允许在不指定行的情况下创建实例,那么您需要在 base 类中添加一个无参数构造函数:

public MaliciousSmall()
{
    // Set fields/properties to some default values
}

你可能希望你的派生类有两个构造函数:

public Malicious() // Implicitly chain to the parameterless base constructor
{
}

public Malicious(DataRow row) : base(row) // Chain to parameterized constructor
{
}

更多详情请查看我的article on constructor chaining

【讨论】:

  • 那么你对我说的是在做 public Malicious(DataRow row) : base(row) 我正在执行 MaliciousSmall 构造函数的覆盖,在我的 Malicious 构造函数中?
  • @AndreaNobili:构造函数不是虚拟的——你不能覆盖它们。但是,每个构造函数都需要链接到同一类中的另一个构造函数,或者基类中的构造函数——链接的构造函数在执行链接的构造函数的主体之前执行。该代码从Malicious(DataRow) 构造函数链接到MaliciousSmall(DataRow) 构造函数。阅读我在答案底部链接到的文章。
  • @AndreaNobili ,如果您要进行 C# 编程,值得阅读 Jon Skeets 关于构造函数如何工作的文章。他在回答下面简要提到了这一点:yoda.arachsys.com/csharp/constructors.html
  • 好的,完美,tnx 这么多,现在我也将阅读您的文章
  • @hijarian 一点也不。如果您显式编写非默认构造函数,生成默认构造函数将是完全错误的做法。它会让你类的任何消费者完全绕过你试图放置的不变量。
【解决方案2】:

我尝试创建一个以 DataRow 对象为参数的空构造函数

我认为您对 empty 一词感到困惑。根据定义,空构造函数不接受任何参数。不能有带参数的空构造函数。

如果您也想在派生类的构造函数中保留参数,则需要使用base 关键字来指定基构造函数。

public Malicious(DataRow row)
    : base(row)
{
}

【讨论】:

    【解决方案3】:

    你的类Malicious根本没有定义任何构造函数,并且来自MSDN docs for Using Constructors

    除非类是静态的,没有构造函数的类被赋予一个 C# 编译器的公共默认构造函数,以便启用 类实例化。

    这意味着你的班级有:

    public class Malicious : MaliciousSmall
    {
       public Malicious()
       {
       }
    }
    

    来自same MSDN link

    在派生类中,如果未调用基类构造函数 通过使用base 关键字显式地使用默认构造函数,如果 有一个,被隐式调用。

    这实际上意味着:

       public Malicious() :base() //implicitly calling base class constructor
    

    由于您的基类没有默认构造函数(没有参数的构造函数),您会收到错误消息。

    现在您有两个选项可以修复该错误。

    1. 在您的基类中定义一个默认构造函数。
    2. 从派生类中显式调用基构造函数。

    可能对于您的情况,显式调用基本构造函数似乎更好,因为两个构造函数都接收相同的类型参数。 你可以这样做:

    public Malicious(DataRow row) :base(row)
    

    【讨论】:

      【解决方案4】:

      如果您不想添加无参数构造函数,请将row 传递给 base 类构造函数:

      public Malicious(DataRow row):base(row)
      { 
      
      }
      

      【讨论】:

        【解决方案5】:

        如果您从基类派生任何类,那么您应该在基类中添加无参数构造函数,或者指定要在派生类中调用的基类构造函数。 因此,为了解决您的问题: 解决方案1:在基类中添加无参数构造函数,即在MaliciousSmall as,

        public MaliciousSmall()
        {
        }
        

        解决方案2:在派生类构造函数中指定基类构造函数为,

        public DataRow row;
        public Malicious: base(row)
        {
        }
        

        希望对您有所帮助!

        【讨论】:

          【解决方案6】:

          如果类中没有定义构造函数,编译器会提供一个默认/无参数构造函数,用于实例化其对应的对象,如下所示。

          class MaliciousSmall
          {
              //if no constructors are defined then compiler adds the following
              //public MaliciousSmall()
          }
          
          class Malicious: MaliciousSmall
          {
              //if no constructors are defined then compiler adds the following
              //public Malicious() : base()
          }
          
          Malicious obj = new Malicious();
          

          由于您在基类中定义了构造函数,编译器假定您不需要默认/无参数构造函数。当MaliciousSmall 的默认构造函数尝试调用其基类的默认构造函数时,构造函数链接会中断。

          class MaliciousSmall
          {
              public MaliciousSmall(DataRow row)
              {
                  //compiler will not supply a default constructor
              }
          }
          
          class Malicious: MaliciousSmall
          {
              //if no constructors are defined then compiler adds the following
              //public Malicious() : base()
          }
          
          Malicious obj = new Malicious();
          

          对象的实例化需要调用 Malicious 类的默认构造函数,而后者又会尝试调用基类的默认构造函数,但由于它不存在,因此构造函数链接中断。

          建议我们使用所需的构造函数,以免导致链接中断。

          class MaliciousSmall
          {
              public MaliciousSmall()
              {
                  //
              }
          
              public MaliciousSmall(DataRow row)
              {
                  //
              }
          }
          
          class Malicious:MaliciousSmall
          {
              public Malicious()
              {
                  //
              }
          
              public Malicious(DataRow row):base(row)
              {
                  //
              }
          }
          
          Malicious obj = new Malicious();
          

          构造函数非常重要,因为我认为您的程序在没有对象实例化的情况下不会有任何进展,请务必访问 MSDN 并努力阅读有关 this 关键字的信息。

          【讨论】:

            猜你喜欢
            • 2012-01-01
            • 2012-08-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-07
            相关资源
            最近更新 更多