, даже если я изменю его на Publi c, ошибка не исчезнет
Ну, как минимум, его нужно будет защитить, чтобы MyClass мог получить к нему доступ.
https://dotnetfiddle.net/XFeEdQ
public class Class1
{
class MyClass2 : Class2
{
}
private void RunAlgorithm<T>() where T : Class2, new()
{
T argInstance = new T();
}
public static void Main(string[] args)
{
new Class1().RunAlgorithm<MyClass2>();
}
}
public class Class2
{
protected Class2() { }
public string setParameters { get; set; }
}
Таким образом, ваше сообщение «Class1.MyClass2 должно иметь publi c конструктор без параметров» говорит о том, что вашему MyClass нужен конструктор. Мой выше имеет такой конструктор, хотя его нет в коде; в отсутствие разработчика, предоставляющего конструктор, компилятор предоставляет тот, который не делает ничего, кроме вызова базового конструктора без параметров ...
..., что приводит меня к следующему пункту; Ваш MyClass2 расширяет Class2, и, следовательно, конструктор Class2 должен быть доступен для него. В то время как конструктор Class2 является закрытым, конструктор MyClass2 не может вызвать его. Каждый конструктор в c# должен вызывать другой конструктор или базовый конструктор. Если вы не укажете что, компилятор вставит для вас вызов base (), который завершится неудачно, если базовый конструктор недоступен
Чтобы все это работало, вам нужен publi c без параметров конструктор в MyClass2:
public MyClass2():base(){}
- или без базы (компилятор добавит базовый вызов)
- или пустой (компилятор добавит все это)
и вам нужно что-то, что делает конструктор Class2 доступным для MyClass2, ie объявляя конструктор Class2 как publi c или защищенный