Подтвердить что ты не робот

Тип "..." не имеет определенных конструкторов

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

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

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

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

    class MyClass
    {
        MyClass()
        {
        }
    }
}
4b9b3361

Ответ 1

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

public class MyClass
{
    internal MyClass()
    {
    }
}

Ответ 2

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

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

  • В VS2010 Solution Explorer щелкните правой кнопкой мыши ссылку на Interop Reference, которую вы используете.
  • Выберите "Свойства" и найдите Embed Interop Types
  • Измените его с True на False

Здесь вы можете прочитать об Embedded Interop Types здесь.

Пабло

Ответ 3

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

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

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

EDIT: Я действительно думал, что не представил это, так как сначала увидел "внутренний" конструктор. Тем не менее, я оставлю это сейчас, так как моя версия делает правильный компилятор С# - существует разница между типом, не имеющим доступных конструкторов и по-настоящему не имеющим конструкторов:)

Ответ 4

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

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

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

Ответ 5

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

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

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

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

CS0143, если вы пытаетесь вызвать конструктор для встроенного типа, например Double, но в С# 4.0, который теперь генерирует CS1729:

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

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

Double d = new Double(1.25);

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

Ответ 6

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