39 votes

Le type '...' n'a pas de constructeur défini.

Je remarque l'erreur du compilateur Le type '...' n'a pas de constructeur défini. généré lorsque je tente par erreur d'instancier une classe particulière.

Cela m'a conduit à me demander comment je pourrais écrire ma propre classe qui déclencherait ce message lorsque quelqu'un tenterait de l'instancier.

Donc le code ci-dessous, que dois-je faire pour MyClass ?

namespace MyNamespace
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass mc = new MyClass();
        }
    }

    class MyClass
    {
        MyClass()
        {
        }
    }
}

42voto

Frédéric Hamidi Points 123646

Cette erreur ( CS0143 ) se produit si la classe ne définit qu'un interne et vous essayez de l'instancier à partir d'un autre assemblage.

public class MyClass
{
    internal MyClass()
    {
    }
}

25voto

Pabinator Points 262

Cette erreur peut également être causée si vous compilez avec Framework 4 ou plus et que vous intégrez les types d'interopérabilité dans votre assemblage géré. Pour vous débarrasser de cette erreur, vous devez désactiver (No embed) les Embedded Interop Types.

Instructions pour désactiver l'intégration :

  1. Dans l'explorateur de solutions VS2010, cliquez avec le bouton droit de la souris sur la référence interop que vous utilisez.
  2. Sélectionnez Propriétés et recherchez Embed Interop Types
  3. Changez-le de Véritable à Faux

Vous pouvez lire la section sur les types d'interopérabilité embarqués. aquí .

Pablo

11voto

Jon Skeet Points 692016

J'ai réussi à reproduire ce problème :

  • Création d'une classe statique dans une DLL
  • Utilisation de ildasm pour le décompiler en IL
  • Modification de l'IL pour supprimer les modificateurs "abstract" et "sealed" de la classe.
  • Reconstruction de la DLL avec ilasm
  • Compilation d'un programme qui tente de créer une instance de la classe

Si vous ne supprimez pas les modificateurs abstract/sealed, le compilateur C# la reconnaît comme une classe statique et donne un message d'erreur différent. Bien entendu, vous pouvez également commencer par un type "normal" et supprimer les constructeurs.

EDIT : Je pensais en fait que je n'avais pas soumis ceci, car j'ai vu le constructeur "interne" en premier. Cependant, je vais le laisser maintenant car ma version rend le compilateur C# correct - il y a une différence entre un type n'ayant pas de accessible constructeurs et n'ayant véritablement aucun constructeur :)

5voto

Brian Dishaw Points 3522

Je pense que vous devez rendre le constructeur de la classe interne pour qu'il lève cette exception. Je pense que vous devrez également faire en sorte que la classe existe dans une autre assemblée.

namespace MyNamespace
{ 
   class Program
   {
       static void Main(string[] args)
       {
           MyClass mc = new MyClass();
       }
   }
}

namespace DifferentNamespace
{
   class MyClass
   {
      internal MyClass()
      {
      }
   }
}

3voto

Igby Largeman Points 8671

Comme il a été dit, vous pouvez obtenir CS0143 en essayant d'instancier une classe avec une interne depuis l'extérieur de son assemblage.

Mais je crois que c'est un bug du compilateur. L'erreur générée devrait être CS0122 :

Le membre est inaccessible en raison de son niveau de protection.

... ce qui est l'erreur que vous obtenez si vous essayez d'instancier une classe avec seulement un private constructeur.

CS0143 Cela se produisait (jusqu'à C# 3.0) si vous essayiez d'appeler un constructeur pour un type intégré comme Double mais dans C# 4.0, cela génère maintenant CS1729 :

Le "type" ne contient pas de constructeur qui prend des arguments "nombre".

si vous passez un argument

Double d = new Double(1.25);

... ou aucune erreur du tout si vous ne passez aucun argument au constructeur.

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