类不包含带0参数的构造函数

时间:2014-03-11 09:20:40

标签: c# .net

我有两个分别被称为的类:恶意恶意小恶机

恶意代码

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 类,我在恶意构造函数上获得了以下错误:

  

错误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)
        {

        }
    }
}

但我仍有同样的问题。我错过了什么?我该怎么做才能解决?

6 个答案:

答案 0 :(得分:85)

错误告诉您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

答案 1 :(得分:7)

  

我尝试创建一个将DataRow对象作为参数

的空构造函数

我认为你将这个词搞糊涂了。根据定义,空构造函数不接受任何参数。你不能有一个带参数的空构造函数。

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

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

答案 2 :(得分:4)

你的班级Malicious根本没有定义任何构造函数,而是MSDN docs for Using Constructors

  

除非该类是静态的,否则给出没有构造函数的类   公共默认构造函数由C#编译器启用   类实例化。

这意味着你的班级有:

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

来自same MSDN link

  

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

这实际上意味着:

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

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

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

  1. 在基类中定义默认构造函数。
  2. 从派生类中显式调用基础构造函数。
  3. 可能对于你的情况,显式调用基本构造函数似乎更好,因为两个构造函数都接收相同的类型参数。 你可以这样做:

    public Malicious(DataRow row) :base(row)
    

答案 3 :(得分:3)

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

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

}

答案 4 :(得分:2)

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

public MaliciousSmall()
{
}

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

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

希望这会对你有帮助!

答案 5 :(得分:0)

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

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关键字的信息