29 votes

La classe ne contient pas un constructeur qui prend 0 argument.

J'ai ces 2 classes qui s'appellent respectivement : Malicious et MaliciousSmall :

Code de Malicious :

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

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

Code de 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();

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

}

Mon problème est que, après cela, j'ai implémenté la fonction MaliciousSmall j'obtiens l'erreur suivante sur la classe Malicious constructeur :

Erreur 53 'DataModel.MaliciousCode.MaliciousSmall' ne contient pas de constructeur prenant 0,5 % de la valeur du code. constructeur qui prend 0 arguments C:\Develop\EarlyWarning\public\Implementazione\Ver2\DataModel\MaliciousCode\Malicious.cs 9 18 DataModel

Que puis-je faire pour le résoudre ?

J'ai essayé de créer un constructeur vide qui prend un DataRow en tant que paramétreur, quelque chose comme ça :

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

        }
    }
}

Mais j'ai toujours le même problème. Que me manque-t-il ? Que puis-je faire pour le résoudre ?

85voto

Jon Skeet Points 692016

L'erreur vous indique que le Malicious ne peut pas trouver un constructeur approprié auquel se rattacher dans sa classe de base ( MaliciousSmall ).

Le problème initial est que le constructeur de votre classe dérivée contient implicitement ce constructeur :

public Malicious() : base()
{
}

Ou même lorsque vous avez ajouté un constructeur explicite, il essaie toujours d'enchaîner avec un constructeur sans paramètre :

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

... mais il y a est aucun constructeur sans paramètre de ce type dans la classe de base ( MaliciousSmall ), d'où l'erreur.

Je pense que vous voulez enchaîner au constructeur prenant une rangée (celle que vous avez ont déclaré dans MaliciousSmall ) :

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

C'est en supposant que vous toujours Je veux qu'une ligne soit fournie au constructeur. Si vous souhaitez réellement permettre la création d'une instance sans spécifier de rang, vous devez ajouter un constructeur sans paramètre à la classe base classe :

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

Vous voudrez alors probablement que votre classe dérivée ait deux constructeurs :

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

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

Voir mon article sur le chaînage des constructeurs pour plus de détails.

7voto

Connell Watkins Points 5302

J'ai essayé de créer un constructeur vide qui prend un objet DataRow comme paramètre.

Je pense que vous avez le terme vide confus. Un constructeur vide n'accepte aucun paramètre par définition. Vous ne pouvez pas avoir un constructeur vide avec des paramètres.

Si vous souhaitez conserver le paramètre dans le constructeur de la classe dérivée également, vous devez utiliser l'attribut base pour spécifier le constructeur de base.

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

4voto

Habib Points 93087

Votre classe Malicious n'a pas défini de constructeur du tout, et à partir de l'élément Documents MSDN sur l'utilisation des constructeurs

Sauf si la classe est statique, Les classes sans constructeur sont dotées d'un constructeur public par défaut par le compilateur C# afin de permettre l'instanciation des classes.

Cela signifie que votre classe a :

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

De la même lien MSDN

Dans une classe dérivée, si un constructeur de la classe de base n'est pas appelé explicitement en utilisant la balise base mot-clé, le constructeur par défaut, s'il il y en a un, est appelé implicitement .

Cela signifie effectivement :

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

Puisque votre classe de base n'a pas de constructeur par défaut (un sans paramètre) vous obtenez l'erreur.

Vous avez maintenant deux options pour corriger cette erreur.

  1. Définissez un constructeur par défaut dans votre classe de base.
  2. Appelez explicitement le constructeur de base depuis votre classe dérivée.

Dans votre cas, il est probablement préférable d'appeler le constructeur de base explicitement, puisque les deux constructeurs reçoivent le même type de paramètre. Vous pouvez le faire :

public Malicious(DataRow row) :base(row)

3voto

Mihai Hantea Points 1407

Si vous ne voulez pas ajouter un constructeur sans paramètre, passez la balise row au base constructeur de la classe :

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

}

2voto

Pankaj Points 49

Si vous dérivez une classe de la classe de base, vous devez soit ajouter un constructeur sans paramètre dans la classe de base, soit spécifier un constructeur de la classe de base à appeler dans la classe dérivée. Donc, afin de résoudre votre problème : Solution 1 : Ajouter un constructeur sans paramètre dans la classe de base, c'est-à-dire à MaliciousSmall as,

public MaliciousSmall()
{
}

Solution 2 : Spécifier le constructeur de la classe de base au constructeur de la classe dérivée comme,

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

J'espère que cela vous aidera !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X