El tipo ‘…’ no tiene constructores definidos

Estoy notando el error del comstackdor El tipo ‘…’ no tiene constructores definidos generados cuando bash erróneamente instanciar una clase particular.

Me llevó a preguntarme cómo escribiría mi propia clase que precipitaría este mensaje cuando alguien intentara crear una instancia.

Entonces el código a continuación, ¿qué debo hacer para MyClass ?

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

Este error ( CS0143 ) ocurre si la clase solo define un constructor interno e intentas instanciarlo desde otro ensamblado.

 public class MyClass { internal MyClass() { } } 

También este error podría deberse a que está comstackndo con Framework 4 o superior e incorporando los Tipos de interoperabilidad en su ensamblaje administrado. Para deshacerse de este error, debe desactivar (sin incrustar) los Tipos de Interoperación incrustados.

Instrucciones para desactivar la inserción:

  1. En VS2010 Solution Explorer, haga clic derecho en la referencia de interoperabilidad que está utilizando.
  2. Seleccione Propiedades y busque Embed Interop Types
  3. Cambiarlo de verdadero a falso

Aquí puede leer sobre los Tipos de interoperabilidad integrados.

Pablo

He logrado reproducir esto por:

  • Crear una clase estática en una DLL
  • Usando ildasm para descomstackrlo en IL
  • Editando el IL para eliminar los modificadores “abstractos” y “sellados” de la clase
  • Reconstruir el archivo DLL con ilasm
  • Comstackndo un progtwig que intenta crear una instancia de la clase

Si no elimina los modificadores abstracto / sellado, el comstackdor de C # lo reconoce como una clase estática y da un mensaje de error diferente. Por supuesto, podrías comenzar con un tipo “normal” y simplemente eliminar los constructores también.

EDITAR: en realidad pensé que no había enviado esto, ya que primero vi al constructor “interno”. Sin embargo, lo dejo ahora ya que mi versión hace que el comstackdor de C # sea correcto : hay una diferencia entre un tipo que no tiene constructores accesibles y que realmente no tiene constructores 🙂

Creo que necesitarías hacer que el constructor de la clase sea interno para que arroje esta excepción. Creo que también necesitarás que la clase exista en otra asamblea.

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

Como se ha dicho, puede obtener CS0143 intentando crear una instancia de una clase con un constructor interno desde fuera de su ensamblado.

Pero creo que es un error de comstackción. El error generado debe ser CS0122 :

‘miembro’ es inaccesible debido a su nivel de protección

… que es el error que obtienes si intentas instanciar una clase con solo un constructor private .

CS0143 solía suceder (hasta C # 3.0) si intentaba llamar a un constructor para un tipo integrado como Double , pero en C # 4.0 que ahora genera CS1729 :

‘type’ no contiene un constructor que tome argumentos ‘number’.

si pasas una discusión

Double d = new Double(1.25);

… o ningún error en absoluto si no pasa ningún argumento al constructor.

Otra opción más: el código podría ser correcto, pero podría trabajar en diferentes proyectos en diferentes instancias de Visual Studio y, por lo tanto, primero debe construir el proyecto al que se hace referencia.