“where T: new()”中的new()是什么意思?

14
在下面的代码中,new()是做什么用的?
public class A<T> where T : B, new()
2个回答

36

这是对你的类的泛型参数施加限制,这意味着任何作为泛型类型传递的类型必须具有无参数构造函数。

因此,

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

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

然而,

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

如果不满足约束条件,您将无法创建一个新的 A<D> 实例。如果您还向 D 添加了一个无参数构造函数,则它将再次有效。


5
如果您在泛型约束中使用了new(),则可以在泛型函数中实例化T,就像这样: T instance = new T();如果没有使用new()作为约束条件,就无法直接实例化类(如果您对特定类有约束条件,仍然可以使用静态工厂)。 - Steffen
不错的观点。如果您尝试这样做,实际上会出现编译错误,这是一个不错的提醒,让您添加约束。 - womp

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));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接