以下代码:
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'必须是具有公共无参数构造函数的非抽象类型,才能在泛型类型或方法'DoOtherStuff()'
中将其用作参数'T'
请问有人解释原因吗?
答案 0 :(得分:8)
更改
private IList<T> DoStuff<T>()
到
private IList<T> DoStuff<T>() where T : new()
因为否则您无法保证T
具有new()
构造函数。
答案 1 :(得分:3)
您的DoOtherStuff<T>
方法具有where T : new()
约束。 (也就是说,“T
必须是具有公共无参数构造函数的非抽象类型”。)
您的DoStuff<T>
方法没有该约束,这意味着编译器无法保证合法用于T
的所有类型参数DoStuff
都符合{ {1}}要求{1}}约束。
答案 2 :(得分:2)
DoOtherStuff
的{{1}}指定T
,这意味着它具有公共无参数构造函数。 T : new()
的{{1}}没有任何限制,因此您可能无法说DoStuff
。您应该添加T
执行new T()
。