“T:class,new()”是什么意思?

你能向我解释一下where T : class, new()在下面这行代码中的含义吗?

 void Add<T>(T item) where T : class, new(); 

这是对通用参数T的约束。 它必须是一个class (引用types),并且必须有一个公共参数较less的默认构造函数。

这意味着T不能是一个intfloatdoubleDateTime或任何其他struct (值types)。

它可以是一个string或任何其他的自定义引用types,只要它有一个默认的或无参数的构造函数。

这些是通用types约束。 你的情况有两个:

 where T : class 

意味着typesT必须是引用types(不是值types)。

 where T : new() 

意味着typesT必须有一个无参数的构造函数。 有了这个约束将允许你做一些像T field = new T(); 在你的代码中,你将无法做到这一点。

然后使用逗号将两者结合起来得到:

 where T : class, new() 

T:struct

types参数必须是值types。 可以指定除Nullable之外的任何值types。 有关更多信息,请参阅使用可空types(C#编程指南)。

T:class级

types参数必须是引用types,包括任何类,接口,委托或数组types。 (见下面的注释)

其中T:new()types参数必须具有公共无参数构造函数。 当与其他约束一起使用时,必须最后指定new()约束。

T:[基类名]

types参数必须是或从指定的基类派生。

其中T:[接口名称]

types参数必须是或实现指定的接口。 可以指定多个接口约束。 约束接口也可以是通用的。

T:U

为T提供的types参数必须是从为U提供的参数派生的。这被称为裸types约束。

new():指定new()约束意味着typesT必须使用无参数的构造函数,因此可以从中实例化对象 – 请参阅Default构造函数

类:意味着T必须是一个引用types,所以它不能是一个int,float,double,DateTime或其他结构(值types)。

  public void MakeCars() { //This wont compile as researchEngine doesn't have a public constructor and so cant be instantiated. CarFactory<ResearchEngine> researchLine = new CarFactory<ResearchEngine>(); var researchEngine = researchLine.MakeEngine(); //Can instantiate new object of class with default public constructor CarFactory<ProductionEngine> productionLine = new CarFactory<ProductionEngine>(); var productionEngine = productionLine.MakeEngine(); } public class ProductionEngine { } public class ResearchEngine { private ResearchEngine() { } } public class CarFactory<TEngine> where TEngine : class, new() { public TEngine MakeEngine() { return new TEngine(); } } 

这意味着typesT必须是一个类, 有一个不带任何参数的构造函数。

例如,你必须能够这样做:

 T t = new T(); 

哪里(C#参考)

new()约束让编译器知道提供的任何types参数必须有一个可访问的无参数或默认构造函数

所以它应该是, T必须是一个类,并有一个可访问的无参数 – 或默认的构造函数。

这里是一个类似的问题

classnew 对genericstypes参数T有2个约束 。
他们分别确保:

class

types参数必须是引用types; 这也适用于任何类,接口,委托或数组types。

new

types参数必须有一个公共无参数的构造函数。 与其他约束一起使用时,必须最后指定new()约束。

它们的组合意味着typesT必须是一个引用types (不能是一个值types ),并且必须有一个无参数的构造函数。

例:

 struct MyStruct { } // structs are value types class MyClass1 { } // no constructors defined, so the class implicitly has a parameterless one class MyClass2 // parameterless constructor explicitly defined { public MyClass2() { } } class MyClass3 // only non-parameterless constructor defined { public MyClass3(object parameter) { } } class MyClass4 // both parameterless & non-parameterless constructors defined { public MyClass4() { } public MyClass4(object parameter) { } } interface INewable<T> where T : new() { } interface INewableReference<T> where T : class, new() { } class Checks { INewable<int> cn1; // ALLOWED: has parameterless ctor INewable<string> n2; // NOT ALLOWED: no parameterless ctor INewable<MyStruct> n3; // ALLOWED: has parameterless ctor INewable<MyClass1> n4; // ALLOWED: has parameterless ctor INewable<MyClass2> n5; // ALLOWED: has parameterless ctor INewable<MyClass3> n6; // NOT ALLOWED: no parameterless ctor INewable<MyClass4> n7; // ALLOWED: has parameterless ctor INewableReference<int> nr1; // NOT ALLOWED: not a reference type INewableReference<string> nr2; // NOT ALLOWED: no parameterless ctor INewableReference<MyStruct> nr3; // NOT ALLOWED: not a reference type INewableReference<MyClass1> nr4; // ALLOWED: has parameterless ctor INewableReference<MyClass2> nr5; // ALLOWED: has parameterless ctor INewableReference<MyClass3> nr6; // NOT ALLOWED: no parameterless ctor INewableReference<MyClass4> nr7; // ALLOWED: has parameterless ctor } 

它在generics参数T上被称为“约束”。它意味着T必须是引用types(一个类),并且它必须有一个公共的默认构造函数。

这是generics机制的一部分,其中where关键字为什么types必须实现才能用作types参数。

“Where”是对所声明的genericstypesT的约束,所以:

  • 意味着T应该是一个类而不是一个值types或一个结构。

  • new()表示T类应该有一个公共无参数的默认构造函数。