通用方法编译时错误

时间:2011-07-28 22:58:39

标签: c# generics abstract-class

以下代码:

    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'   

请问有人解释原因吗?

3 个答案:

答案 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()