Общая ошибка компиляции метода
Следующий код:
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
,