在下面的代码中,new()是做什么用的?
public class A<T> where T : B, new()
这是对你的类的泛型参数施加限制,这意味着任何作为泛型类型传递的类型必须具有无参数构造函数。
因此,
public class C : B
{
public C() {}
}
这将是一个有效的类型。您可以创建一个 A<C>
的新实例。
然而,
public class D : B
{
public D(int something) {}
}
如果不满足约束条件,您将无法创建一个新的 A<D>
实例。如果您还向 D 添加了一个无参数构造函数,则它将再次有效。
使用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));
}