Общая ошибка компиляции метода - PullRequest
1 голос
/ 29 июля 2011

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

    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 ]

8 голосов
/ 29 июля 2011

Изменение

private IList<T> DoStuff<T>()

до

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

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

3 голосов
/ 29 июля 2011

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

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

2 голосов
/ 29 июля 2011

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

...