Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# new()在where T:new()中做什么`_C#_.net_Generics - Fatal编程技术网

C# new()在where T:new()中做什么`

C# new()在where T:new()中做什么`,c#,.net,generics,C#,.net,Generics,new()在下面的代码中做什么 public class A<T> where T : B, new() 公共A类,其中T:B,new() 这是对类的泛型参数的约束,意味着作为泛型类型传递的任何类型都必须具有无参数构造函数 所以 将是有效的类型。您可以创建a的新实例 但是, public class D : B { public D(int something) {} } 将不满足约束,并且不允许您创建a的新实例。如果您还向D添加了无参数构造函数,那么它将再次有效。new(

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

public class A<T> where T : B, new()
公共A类,其中T:B,new()

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

所以

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

但是,

public class D : B
{
   public D(int something) {}
}
将不满足约束,并且不允许您创建
a
的新实例。如果您还向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));
}
公共A类,其中T:B
{
公共无效方法(函数)
{
T obj=ctor();
// ....
}
}
//其他地方。。。
公共类C:B
{
公共C(对象obj){}
}
公共空间
{
A=新的A();
对象参数=新对象();
a、 方法(()=>newc(ctorParam));
}

另外,如果将new()作为泛型约束,则可以在泛型函数中实例化T,如下所示:T instance=new T();没有new()作为约束,就无法直接实例化类(如果对特定类有约束,仍然可以使用静态工厂)。如果您尝试这样做,实际上会出现编译错误,这是提醒您添加约束的好方法。
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));
}