泛型类型实现中的值和引用类型

Lam*_*fif 6 .net c# oop generics types

我搜索了一下generic type in C#,我得出了这个结论:

  1. 所有参考类型均基于 Class
  2. 所有值类型都基于 struct
  3. 除了值和引用类型之间的全局差异之外,struct和class之间的主要区别是:

    • 结构中没有继承

    • 结构不能包含空构造函数(不带参数)

  4. 泛型类型有六种基本实现:
  • 其中T:class ==>泛型参数必须是引用类型

  • 其中T:classA ==>泛型参数必须是类classA的实例

  • 其中T:InterfaceA ==>泛型参数必须实现接口InterfaceA

  • 其中T:New()==>泛型参数必须是类+具有默认的空构造函数

  • 其中T:U ==>泛型参数必须从类U派生或实现接口U.

  • 其中T:struct ==>泛型参数必须是值类型

所以我需要知道:

  1. 如果我的结论是正确的?
  2. 我无法理解之间的区别:
  • 其中T:New()==>带有空构造函数的类

  • 其中T:class,New()==>带有空构造函数的类

为什么使用第二种形式?为什么我们不只是使用第一个?

谢谢,

Jon*_*eet 10

您所描述的是通用约束.

其中T:New()==>泛型参数必须是类+具有默认的空构造函数

不,那只是说"类型参数必须有一个无参数构造函数".这实际上包括所有价值类型.即使您无法在C#6之前为结构声明自己的无参数构造函数,也可以随时调用它们.例如:

Guid guid = new Guid();
Run Code Online (Sandbox Code Playgroud)

所以如果你有:

public void Foo<T>() where T : new()
Run Code Online (Sandbox Code Playgroud)

打电话完全有效

Foo<Guid>();
Run Code Online (Sandbox Code Playgroud)