Ответ 1
Эта ошибка (CS0143) возникает, если класс определяет internal, и вы пытаетесь создать экземпляр из другой сборки.
public class MyClass
{
internal MyClass()
{
}
}
Я замечаю ошибку компилятора Тип '...' не имеет конструкторов, определенных, сгенерированных, когда я ошибочно пытаюсь создать экземпляр класса участника.
Это заставило меня задаться вопросом, как я буду писать собственный класс, который ускорит это сообщение, когда кто-то попытается его создать.
Итак, код ниже, что мне нужно сделать, чтобы MyClass
?
namespace MyNamespace
{
class Program
{
static void Main(string[] args)
{
MyClass mc = new MyClass();
}
}
class MyClass
{
MyClass()
{
}
}
}
Эта ошибка (CS0143) возникает, если класс определяет internal, и вы пытаетесь создать экземпляр из другой сборки.
public class MyClass
{
internal MyClass()
{
}
}
Также эта ошибка может быть причиной, если вы компилируете Framework 4 или выше и встраиваете Interop Types в управляемую сборку. Чтобы избавиться от этой ошибки, вам нужно отключить (не встраивать) встроенные типы взаимодействия.
Инструкции по отключению вложения:
Embed Interop Types
Здесь вы можете прочитать об Embedded Interop Types здесь.
Пабло
Мне удалось воспроизвести это:
ildasm
, чтобы декомпилировать его в ILilasm
Если вы не удаляете абстрактные/опечатанные модификаторы, компилятор С# распознает его как статический класс и дает другое сообщение об ошибке. Конечно, вы можете начать с "нормального" типа и просто удалить конструкторы тоже.
EDIT: Я действительно думал, что не представил это, так как сначала увидел "внутренний" конструктор. Тем не менее, я оставлю это сейчас, так как моя версия делает правильный компилятор С# - существует разница между типом, не имеющим доступных конструкторов и по-настоящему не имеющим конструкторов:)
Я считаю, что вам нужно будет сделать конструктор класса внутренним, чтобы он выбрал это исключение. Я считаю, что вам также понадобится, чтобы класс существовал в другой сборке.
namespace MyNamespace
{
class Program
{
static void Main(string[] args)
{
MyClass mc = new MyClass();
}
}
}
namespace DifferentNamespace
{
class MyClass
{
internal MyClass()
{
}
}
}
Как уже было сказано, вы можете получить CS0143, пытаясь создать экземпляр класса с внутренний конструктор извне его сборки.
Но я считаю, что это ошибка компилятора. Сгенерированная ошибка должна быть CS0122:
'член' недоступен из-за уровня защиты
... это ошибка, которую вы получаете, если пытаетесь создать экземпляр класса только с конструктором private
.
CS0143
, если вы пытаетесь вызвать конструктор для встроенного типа, например Double, но в С# 4.0, который теперь генерирует CS1729:
'type' не содержит конструктор, который принимает аргументы "number".
если вы передадите аргумент
Double d = new Double(1.25);
... или вообще никакой ошибки, если вы не передадите какие-либо аргументы конструктору.
Еще один вариант: код может быть прав, но вы можете работать с разными проектами в разных экземплярах Visual Studio, и поэтому вам нужно сначала создать указанный проект.