O tipo ‘…’ não possui construtores definidos

Estou percebendo o erro do compilador O tipo ‘…’ não tem construtores definidos gerados quando eu erroneamente tentar instanciar uma class particlar.

Isso me levou a imaginar como eu iria escrever minha própria aula que precipitaria essa mensagem quando alguém tentasse instanciá-la.

Então, o código abaixo, o que eu preciso fazer no MyClass ?

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

Esse erro ( CS0143 ) ocorre se a class apenas define um construtor interno e você tenta instanciá-lo de outro assembly.

 public class MyClass { internal MyClass() { } } 

Além disso, esse erro pode ser causado se você estiver compilando com o Framework 4 ou superior e incorporando os tipos de interoperabilidade ao seu assembly gerenciado. Para se livrar desse erro, você precisa desativar (sem incorporar) os Tipos de Interoperabilidade Incorporada.

Instruções para desativar a incorporação:

  1. No Solution Explorer do VS2010, clique com o botão direito do mouse na Referência de Interoperabilidade que você está usando.
  2. Selecione Propriedades e procure por Embed Interop Types
  3. Altere de verdadeiro para falso

Você pode ler sobre os tipos de interoperabilidade incorporados aqui .

Pablo

Eu consegui reproduzir isso por:

  • Criando uma class estática em uma DLL
  • Usando ildasm para descompilar para IL
  • Editando o IL para remover os modificadores “abstrato” e “selado” da class
  • Reconstruindo a DLL com o ilasm
  • Compilando um programa que tenta criar uma instância da class

Se você não remover os modificadores abstrato / selado, o compilador C # o reconhecerá como uma class estática e fornecerá uma mensagem de erro diferente. Claro, você poderia começar com um tipo “normal” e apenas remover os construtores também.

EDIT: Eu realmente pensei que eu não tinha apresentado isso, como eu vi o construtor “interno” um primeiro. No entanto, vou deixá-lo agora como minha versão faz o compilador C # correto – há uma diferença entre um tipo que não tem construtores acessíveis e genuinamente não tem construtores 🙂

Eu acredito que você precisaria fazer o construtor da class interna para que ele jogasse essa exceção. Eu acredito que você também precisará que a class exista em outra assembléia.

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

Como já foi dito, você pode obter o CS0143 tentando instanciar uma class com um construtor interno de fora de sua assembly.

Mas eu acredito que é um erro de compilador. O erro gerado deve ser CS0122 :

‘membro’ é inacessível devido ao seu nível de proteção

… qual é o erro que você recebe se tentar instanciar uma class com apenas um construtor private .

CS0143 costumava acontecer (até C # 3.0) se você tentasse chamar um construtor para um tipo interno como Double , mas no C # 4.0 que agora gera o CS1729 :

‘type’ não contém um construtor que aceita argumentos ‘number’.

se você passar um argumento

Double d = new Double(1.25);

… ou nenhum erro se você não passar nenhum argumento para o construtor.

Ainda outra opção: o código pode estar certo, mas você pode trabalhar em diferentes projetos em diferentes instâncias do Visual Studio e, portanto, você precisa criar o projeto referenciado primeiro.