new()在`where T:new()?中做了什么

时间:2009-07-06 04:35:02

标签: c# .net generics

new()在下面的代码中做了什么?

public class A<T> where T : B, new()

2 个答案:

答案 0 :(得分:36)

这是对类的泛型参数的约束,这意味着作为泛型类型传递的任何类型都必须具有无参数构造函数。

所以,

public class C : B
{
    public C() {}
}

是有效的类型。您可以创建A<C>的新实例。

然而,

public class D : B
{
   public D(int something) {}
}

不满足约束,并且不允许您创建A<D>的新实例。如果您还向D添加了无参数构造函数,那么它将再次有效。

答案 1 :(得分:3)

new()约束意味着T必须具有公共无参数构造函数。对T()的任何调用都会变成对Activator.CreateInstance()的各种重载的调用。一种更灵活的方法(比如,如果构造函数需要参数,或者是内部而不是公共的)是使用委托:

public class A<T> where T : B
{
    public void Method(Func<T> ctor)
    {
        T obj = ctor();
        // ....
    }
}

// elsewhere...
public class C : B
{
    public C(object obj) {}  
}

public void DoStuff()
{
    A<C> a = new A<C>();
    object ctorParam = new object();
    a.Method(() => new C(ctorParam));
}