Подтвердить что ты не робот

Класс не содержит конструктор, который принимает 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)
        {

        }
    }
}

Но у меня все та же проблема. Что мне не хватает? Что я могу сделать для решения?

4b9b3361

Ответ 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 ключевое слово.