Класс не содержит конструктор, который принимает 0 аргументов
У меня есть эти 2 класса, которые называются соответственно: Вредоносные и MaliciousSmall:
Код Вредоносный:
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)
{
}
}
}
Но у меня все та же проблема. Что мне не хватает? Что я могу сделать для решения?
Ответы
Ответ 1
Ошибка говорит вам, что конструктор Malicious
не может найти подходящий конструктор для привязки к его базовому классу (MaliciousSmall
).
Исходная проблема заключается в том, что конструктор производного класса неявно содержит этот конструктор:
public Malicious() : base()
{
}
Или даже когда вы добавили явный конструктор, он все еще пытается привязать к беззаметному:
public Malicious(DataRow row) : base()
{
}
... но нет такого конструктора без параметров в базовом классе (MaliciousSmall
), следовательно, ошибка.
Я думаю, вы хотите привязать конструктор к строке (той, которую вы объявили в MaliciousSmall
):
public Malicious(DataRow row) : base(row)
{
}
Предполагая, что вы всегда хотите, чтобы строка была предоставлена конструктору. Если вы действительно хотите разрешить создание экземпляра без указания строки, вам нужно добавить конструктор без параметров в базовый класс:
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
{
}
Подробнее см. статью о цепочке конструкторов.
Ответ 2
Я попытался создать пустой конструктор, который принимает объект DataRow в качестве параметра
Я думаю, что у вас есть термин empty confused. Пустой конструктор не принимает параметры по определению. У вас не может быть пустой конструктор с параметрами.
Если вы хотите сохранить параметр в конструкторе производного класса, вам нужно использовать ключевое слово base
, чтобы указать базовый конструктор.
public Malicious(DataRow row)
: base(row)
{
}
Ответ 3
Вы класс Malicious
не определили никакого конструктора вообще и из MSDN docs для использования конструкторов
Если класс не является статическим, классы без конструкторов задаются публичный конструктор по умолчанию компилятором С#, чтобы включить класса.
Это означает, что ваш класс имеет:
public class Malicious : MaliciousSmall
{
public Malicious()
{
}
}
От та же ссылка MSDN
В производном классе, если конструктор базового класса не вызывается явно используя ключевое слово base
, конструктор по умолчанию, если есть один, называется неявно.
Это эффективно означает:
public Malicious() :base() //implicitly calling base class constructor
Поскольку ваш базовый класс не имеет конструктора по умолчанию (без параметра), вы получаете ошибку.
Теперь у вас есть две возможности исправить эту ошибку.
- Определите конструктор по умолчанию в базовом классе.
- Явно вызов базового конструктора из производного класса.
Вероятно, для вашей ситуации лучше явно вызвать базовый конструктор, поскольку оба конструктора получают одинаковый параметр.
Вы можете сделать:
public Malicious(DataRow row) :base(row)
Ответ 4
Если вы не хотите добавлять конструктор без параметров, передайте row
в конструктор базового класса:
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
ключевое слово.