你能解释一下T: class, new()在下一行代码中是什么意思吗?
void Add<T>(T item) where T : class, new();
你能解释一下T: class, new()在下一行代码中是什么意思吗?
void Add<T>(T item) where T : class, new();
当前回答
where (c#参考)
new() Constraint让编译器知道提供的任何类型参数必须有一个可访问的无参数——或默认——构造函数
所以它应该是,T必须是一个类,并且有一个可访问的无参数构造函数,或者默认构造函数。
其他回答
new():指定new()约束意味着类型T必须使用无参数构造函数,因此可以从它实例化对象-请参阅默认构造函数。
class:意思是T必须是一个引用类型,所以它不能是int, float, double, DateTime或其他结构(值类型)。
public void MakeCars()
{
//This won't compile as researchEngine doesn't have a public constructor and so can't 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();
}
}
这些是泛型类型约束。在你的例子中有两个:
where T : class
意味着类型T必须是引用类型(而不是值类型)。
where T : new()
意味着类型T必须有一个无参数的构造函数。有了这个约束,你可以这样做T field = new T();在你的代码中,你不能这样做。
然后用逗号将两者结合起来,得到:
where T : class, new()
这意味着类型T必须是一个类,并且有一个不接受任何参数的构造函数。
例如,你必须能够这样做:
T t = new T();
这是对泛型参数t的约束。它必须是一个类(引用类型),并且必须有一个无公共参数的默认构造函数。
这意味着T不能是int、float、double、DateTime或任何其他结构(值类型)。
它可以是字符串,也可以是任何其他自定义引用类型,只要它有默认的或无参数的构造函数。
where (c#参考)
new() Constraint让编译器知道提供的任何类型参数必须有一个可访问的无参数——或默认——构造函数
所以它应该是,T必须是一个类,并且有一个可访问的无参数构造函数,或者默认构造函数。