C# проблема с созданием класса - PullRequest
0 голосов
/ 05 марта 2020

Я запускаю проект C# на VS2019 со следующей структурой кода:

В файле Class1.cs:

public class Class1
{
    public class MyClass2 : Class2
    {
        ...
    }

    private void RunAlgorithm<T>() where T : Class2, new()
    {
        T argInstance = new T();
        ...
    }

    static void Main(string[] args)
    {
        RunAlgorithm<MyClass2>();
    }

}

В файле Class2.cs:

public class Class2
{
    public Class2() { }
    public string setParameters { get; set; }
}

Я получаю следующую ошибку для строки RunAlgorithm<MyClass2>();

'Class1.MyClass2' должен быть неабстрактный тип с открытым конструктором без параметров для использования его в качестве параметра 'T' в универсальном типе или методе c Class1.RunAlgorithm () '

1 Ответ

1 голос
/ 05 марта 2020

, даже если я изменю его на 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 или защищенный

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