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

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

public class A where T : B, new() 

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

所以,

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

将是一个有效的类型。 您可以创建A的新实例。

然而,

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

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

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

 public class A where T : B { public void Method(Func ctor) { T obj = ctor(); // .... } } // elsewhere... public class C : B { public C(object obj) {} } public void DoStuff() { A a = new A(); object ctorParam = new object(); a.Method(() => new C(ctorParam)); }