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

Jos*_*orp 14 .net c# generics

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

public class A<T> where T : B, new()
Run Code Online (Sandbox Code Playgroud)

wom*_*omp 36

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

所以,

public class C : B
{
    public C() {}
}
Run Code Online (Sandbox Code Playgroud)

将是一个有效的类型.您可以创建一个新的实例A<C>.

然而,

public class D : B
{
   public D(int something) {}
}
Run Code Online (Sandbox Code Playgroud)

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

  • 此外,如果你有new()作为泛型约束,你实际上可以在泛型函数中实例化T,如下所示:T instance = new T(); 如果没有new()作为约束,则无法直接实例化类(如果您对特定类有约束,您仍然可以使用静态工厂) (5认同)