Общая ошибка компиляции метода

Следующий код:

    private IList<T> DoStuff<T>()
    {
        IList<T> res = new List<T>();
        for (int i = 0; i < 10; i++)
        {
            T item = DoOtherStuff<T>();
            res.Add(item);
        }
        return res;
    }

    private T DoOtherStuff<T>() where T : new()
    {
        return new T();
    }

Создает следующую ошибку:

'T' должен быть неабстрактным типом с открытым конструктором без параметров, чтобы использовать его в качестве параметра 'T' в универсальном типе или методе 'DoOtherStuff()'

Пожалуйста, может кто-нибудь объяснить, почему?

3 ответа

Решение

+ Изменить

private IList<T> DoStuff<T>()

в

private IList<T> DoStuff<T>() where T : new()

так как в противном случае вы не можете гарантировать, что T имеет new() конструктор.

Ваш DoOtherStuff<T> метод имеет where T : new() ограничение. (То есть, "T должен быть неабстрактным типом с открытым конструктором без параметров ".)

Ваш DoStuff<T> метод не имеет такого ограничения, что означает, что компилятор не может гарантировать, что все аргументы типа T которые могут быть законно использованы для DoStuff встретит where T : new() ограничение требуется DoOtherStuff,

DoOtherStuff"s T указывает, что T : new(), что означает, что у него есть открытый конструктор без параметров. DoStuff"s T не имеет ограничений, поэтому вы не сможете сказать new T(), Вы должны добавить where T : new() делать DoStuff,

Другие вопросы по тегам