你能解释一下T: class, new()在下一行代码中是什么意思吗?
void Add<T>(T item) where T : class, new();
你能解释一下T: class, new()在下一行代码中是什么意思吗?
void Add<T>(T item) where T : class, new();
当前回答
这意味着类型T必须是一个类,并且有一个不接受任何参数的构造函数。
例如,你必须能够这样做:
T t = new T();
其他回答
这是对泛型参数t的约束。它必须是一个类(引用类型),并且必须有一个无公共参数的默认构造函数。
这意味着T不能是int、float、double、DateTime或任何其他结构(值类型)。
它可以是字符串,也可以是任何其他自定义引用类型,只要它有默认的或无参数的构造函数。
这意味着类型T必须是一个类,并且有一个不接受任何参数的构造函数。
例如,你必须能够这样做:
T t = new T();
where T: struct
type参数必须是值类型。可以指定除Nullable以外的任何值类型。更多信息请参见使用可空类型(c#编程指南)。
T:类
类型参数必须是引用类型,包括任何类、接口、委托或数组类型。(见下文附注)
其中T: new() 类型参数必须有一个公共的无参数构造函数。当与其他约束一起使用时,new()约束必须在最后指定。
其中T:[基类名]
类型参数必须是或派生自指定的基类。
其中T:[接口名]
类型参数必须是或实现指定的接口。可以指定多个接口约束。约束接口也可以是通用的。
其中T: U
为T提供的类型参数必须是为u提供的类型参数,或者派生自u的类型参数。这被称为裸类型约束。
(原始来源:https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters)
class和new是泛型类型参数T上的两个约束。 它们分别保证:
类
type参数必须是引用类型;这也适用于任何类、接口、委托或数组类型。
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
}
这是泛型机制的一部分,其中where关键字为必须实现的类型添加约束,以便用作类型参数。