Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类的泛型方法&;new()关键字 public类ViewModelBaseEx:ViewModelBase其中T:class,new() { //........... }_C# - Fatal编程技术网

C# 类的泛型方法&;new()关键字 public类ViewModelBaseEx:ViewModelBase其中T: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:class,new()”的含义是什么。class,new()在这个方法定义中的用途是什么。

这意味着
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();