C# 类的泛型方法&;new()关键字 public类ViewModelBaseEx:ViewModelBase其中T:class,new() { //........... }
我在一个示例中发现了这样一个类。在这个类中,部分“其中T:class,new()”的含义是什么。class,new()在这个方法定义中的用途是什么。这意味着C# 类的泛型方法&;new()关键字 public类ViewModelBaseEx:ViewModelBase其中T:class,new() { //........... },c#,C#,我在一个示例中发现了这样一个类。在这个类中,部分“其中T:class,new()”的含义是什么。class,new()在这个方法定义中的用途是什么。这意味着T必须是引用(类)类型,并且它还必须有一个公共默认构造函数 有关更多信息,请参见此处:此处的类将约束T仅为类,即不能为结构和其他值类型 这里的new()用于约束T必须有一个空构造函数 有关类型约束的更多信息,请查看MSDN:这意味着T必须是引用类型(通常是类,接口,委托或数组)(但不是结构),并且它必须具有公共无参数构造函数T()(因此这将排
T
必须是引用(类)类型,并且它还必须有一个公共默认构造函数
有关更多信息,请参见此处:此处的类将约束T仅为类,即不能为结构和其他值类型 这里的new()用于约束T必须有一个空构造函数
有关类型约束的更多信息,请查看MSDN:这意味着
T
必须是引用类型(通常是类
,接口
,委托
或数组)(但不是结构
),并且它必须具有公共无参数构造函数T()
(因此这将排除除类之外的所有前面的约束)。这是一个泛型类型约束
它指定无论T
是什么,它都必须是引用类型(一个class
),并且必须有一个公共的默认无参数构造函数(new()
)
这使人们可以这样做:
public class ViewModelBaseEx<T> : ViewModelBase where T : class, new()
{
//...........
}
如果没有new()
约束,这是不可能的。“class”基本上意味着“t”是一个类类型(也可以是struct=>基元类型)。“new()”语法意味着“t”是一个具有空构造函数的类,因此在类中可以执行以下操作:
var x = new T();
基本上,class,new()
正在添加约束
class表示它应该是class类型(不允许使用结构等)
new()表示它必须有一个不带参数的公共构造函数。其他符合:class
约束的引用类型(但不能与:new()
约束一起使用)是接口(例如iclonable
)和数组类型(如int[]
)。我认为这是令人困惑的。class
并不意味着类型必须是类(正如其他答案所解释的那样)。而且struct
s不仅仅是基本类型(正如人们通常理解的那样),它们也是像Guid
这样的类型。
var obj = new T();