where T : class, new()
是什么意思吗?void Add<T>(T item) where T : class, new();
where T : class, new()
是什么意思吗?void Add<T>(T item) where T : class, new();
T
的限制。它必须是一个 class
(引用类型),并且必须有一个公共的无参默认构造函数。T
不能是 int
、float
、double
、DateTime
或任何其他的 struct
(值类型)。string
,或任何其他自定义的引用类型,只要它有一个默认或无参构造函数。new()
精确指定“必须有一个公共的无参数构造函数”。 - Flaternew()
也会排除只有一个参数和默认值的构造函数... 我觉得这很不直观。 - mBardos这些是通用类型约束。在您的情况下,有两个约束:
where T : class
这意味着类型T
必须是引用类型(而不是值类型)。
where T : new()
意味着类型T
必须具有无参数构造函数。有此约束将允许您在代码中执行T field = new T();
等操作,否则您将无法执行此操作。
然后使用逗号将两者组合起来,得到:
where T : class, new()
where T : struct
类型参数必须是值类型。除了 Nullable 类型之外,任何值类型都可以指定。有关更多信息,请参阅使用可空类型 (C# 编程指南)。
where T : class
类型参数必须是引用类型,包括任何类、接口、委托或数组类型。(请参见下面的说明。)
where T : new()
类型参数必须具有公共的无参数构造函数。当与其他约束一起使用时,new() 约束必须最后指定。
where T : [base class name]
类型参数必须是指定基类或从指定基类派生的类。
where T : [interface name]
类型参数必须实现指定的接口或从指定的接口派生。可以指定多个接口约束。约束接口也可以是泛型的。
where T : U
T 提供的类型参数必须是 U 提供的参数或从其派生的类型。这称为裸类型约束。
class
和new
是对泛型类型参数T
的两个约束条件。它们分别确保:
class
类型参数必须是引用类型;这也适用于任何类、接口、委托或数组类型。
new
类型参数必须具有公共的无参构造函数。当与其他约束一起使用时,必须将new()约束指定为最后一个。
它们的组合意味着类型T
必须是引用类型(不能是值类型),并且必须具有无参构造函数。
示例:
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
}
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();
}
}
这意味着类型T
必须是一个类,并且具有不需要任何参数的构造函数。
例如,您必须能够执行以下操作:
T t = new T();
"Where"后面的内容是对您声明的泛型类型T的限制,因此:
class表示T应该是一个类而不是值类型或结构体。
new()表示T类应该定义公共无参默认构造函数。
这被称为对泛型参数T的“约束”。它意味着T必须是引用类型(一个类),并且它必须具有公共默认构造函数。