“T:class,new()”是什么意思?
你能向我解释一下where T : class, new()
在下面这行代码中的含义吗?
void Add<T>(T item) where T : class, new();
这是对通用参数T
的约束。 它必须是一个class
(引用types),并且必须有一个公共参数较less的默认构造函数。
这意味着T
不能是一个int
, float
, double
, DateTime
或任何其他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
必须是一个类,并有一个可访问的无参数 – 或默认的构造函数。
这里是一个类似的问题
class
和new
对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类应该有一个公共无参数的默认构造函数。