.NET规范是否指定应如何使用构造函数约束?

时间:2010-11-17 13:01:09

标签: .net generics constructor

我一直在使用.NET CLI规范,虽然它提到你可以在泛型类型参数上有一个默认的构造函数约束,但它没有指定任何你可以做使用这种通用类型来实际创建它。使用构造函数约束实际创建泛型类型实例的官方“规范”方法是什么?

3 个答案:

答案 0 :(得分:1)

简单地:

public static void CreateThings<T>() where T : new() {
    T t = new T();
    // now either return t or do other things with it, particularly
    // when combined with interface constraints
}

引用ECMA 334 v4的规格部分

14.5.10.1对象创建表达式

  

的类型   object-creation-expression应该是一个   class-type,value-type或a   具有的类型参数   构造函数约束或值   类型约束(第25.7节)。

...

  

否则,如果T是类型参数:

     
      
  • 如果存在A,则发生编译时错误   发生。
  •   
  • 否则,如果T有   构造函数约束或值   类型约束,结果   objectcreation- expression是一个值   类型T。
  •   
  • 否则,   object-creation-expression无效,   并发生编译时错误。
  •   

答案 1 :(得分:0)

您可以使用泛型类型中的构造函数:

return new T();

答案 2 :(得分:0)

它不是默认构造函数约束,它是无参数构造函数约束。该类必须具有无参数构造函数,无论该构造函数是隐式创建的默认构造函数还是显式声明的无参数构造函数。

这两个类都满足约束条件:

public class A {
}

public class B {
  public B() { }
}

但不是这个,因为如果你有任何显式声明的构造函数,就没有隐式创建的构造函数:

public class C {
  public C(int id) { }
}

由于它是无参数构造函数,因此只有一种方法可以使用它:

T item = new T();

如果在规范中没有提到它,那就很奇怪了,但至少在MS的C#引用中已经清楚地描述了它:new Constraint。然而,规范并不意味着与文档相同的方式阅读,因此可能很难找到确切的位置,并且可能只提到一次。