Тип "..." не имеет конструкторов - PullRequest
39 голосов
/ 05 августа 2011

Я замечаю ошибку компилятора Тип "..." не имеет конструкторов, определенных , сгенерированных, когда я ошибочно пытаюсь создать экземпляр класса speclar.

Это заставляет меня задаться вопросом, какЯ хотел бы написать свой собственный класс, который бы ускорил это сообщение, когда кто-то попытался его создать.

Итак, код ниже, что мне нужно сделать, чтобы MyClass?

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

    class MyClass
    {
        MyClass()
        {
        }
    }
}

Ответы [ 6 ]

42 голосов
/ 05 августа 2011

Эта ошибка ( CS0143 ) возникает, если класс определяет только внутренний конструктор и вы пытаетесь создать его экземпляр из другой сборки.

public class MyClass
{
    internal MyClass()
    {
    }
}
25 голосов
/ 05 мая 2014

Также эта ошибка может быть причиной, если вы компилируете с Framework 4 или новее и встраиваете Interop Types в управляемую сборку. Чтобы избавиться от этой ошибки, необходимо отключить (без встраивания) встроенные типы взаимодействия.

Инструкция по отключению встраивания:

  1. В обозревателе решений VS2010 щелкните правой кнопкой мыши на используемом справочнике по взаимодействию.
  2. Выберите Свойства и найдите Embed Interop Types
  3. Измените его с Верно на Ложь

Вы можете прочитать о встроенных типах взаимодействия здесь .

Pablo

11 голосов
/ 05 августа 2011

Мне удалось воспроизвести это следующим образом:

  • Создание статического класса в DLL
  • Использование ildasm для декомпиляции его в IL
  • РедактированиеIL для удаления «абстрактных» и «запечатанных» модификаторов из класса
  • Перестройка DLL с помощью ilasm
  • Компиляция программы, которая пытается создать экземпляр класса

Если вы не удалите абстрактные / запечатанные модификаторы, компилятор C # распознает его как статический класс и выдаст другое сообщение об ошибке.Конечно, вы могли бы начать с «нормального» типа и просто удалить конструкторы.

РЕДАКТИРОВАТЬ: Я на самом деле думал, что я не представил это, поскольку я сначала увидел «внутренний» конструктор.Однако я оставлю это сейчас, так как моя версия делает компилятор C # правильным - есть разница между типом, не имеющим доступных конструкторов, и действительно не имеющим конструкторов:)

5 голосов
/ 05 августа 2011

Я полагаю, вам нужно сделать конструктор класса внутренним, чтобы он вызывал это исключение. Я полагаю, что вам также понадобится, чтобы класс существовал в другой сборке.

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

namespace DifferentNamespace
{
   class MyClass
   {
      internal MyClass()
      {
      }
   }
}
3 голосов
/ 05 августа 2011

Как уже было сказано, вы можете получить CS0143 , попытавшись создать экземпляр класса с внутренним конструктором снаружи его сборки.

Но я считаю, что это ошибка компилятора.Сгенерированная ошибка должна быть CS0122 :

'member' недоступен из-за уровня защиты

... что вы и получаетеесли вы пытаетесь создать экземпляр класса только с конструктором private.

CS0143 случалось (до C # 3.0), если вы пытались вызвать конструктор для встроенного типа, такого как Двойной , но в C # 4.0, который теперь генерирует CS1729 :

'type', не содержит конструктор, который принимает аргументы 'number'.

если вы передадите аргумент

Double d = new Double(1.25);

... или вообще не будет ошибки, если вы не передадите аргумент конструктору.

0 голосов
/ 11 мая 2017

Еще один вариант: код может быть правильным, но вы можете работать над разными проектами в разных экземплярах Visual Studio, и поэтому вам нужно сначала создать ссылочный проект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...