我有两个分别被称为的类:恶意和恶意小恶机:
恶意代码:
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)
{
}
}
}
但我仍有同样的问题。我错过了什么?我该怎么做才能解决?
答案 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()
{
}
}
在派生类中,如果未调用基类构造函数 显式使用
base
关键字,默认构造函数,if 有一个,被称为隐式。
这实际上意味着:
public Malicious() :base() //implicitly calling base class constructor
由于您的基类没有默认构造函数(一个没有参数),您会收到错误。
现在您有两个选项来修复该错误。
可能对于你的情况,显式调用基本构造函数似乎更好,因为两个构造函数都接收相同的类型参数。 你可以这样做:
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
关键字的信息