我搜索了generic type in C#
并得出了这个结论:
Class
struct
除了值和引用类型之间的全局差异之外,struct和class之间的主要区别是:
struct
结构不能包含空构造函数(不带参数)
其中T:class ==>通用参数必须是引用类型
其中T:classA ==>泛型参数必须是。的实例 class classA
其中T:InterfaceA ==> generic参数必须实现接口 InterfaceA
其中T:New()==>泛型参数必须是一个类+有一个 默认空构造函数
其中T:U ==>泛型参数必须派生类 U 或 实施界面 U
其中T:struct ==> generic参数必须是值类型
所以我需要知道:
其中T:New()==>具有空构造函数的类
其中T:class,New()==>具有空构造函数的类
为什么使用第二种形式?为什么我们不使用第一个?
谢谢,
答案 0 :(得分:10)
您所描述的是通用约束。
其中T:New()==>泛型参数必须是类+具有默认的空 构造
不,那只是说"类型参数必须有一个无参数构造函数"。这实际上包括所有值类型。即使你不能在C#6之前为结构声明自己的无参数构造函数,你总是可以调用它们。例如:
Guid guid = new Guid();
所以如果你有:
public void Foo<T>() where T : new()
调用
非常有效Foo<Guid>();
答案 1 :(得分:2)
泛型约束new()
表示该类型具有无参数构造函数。该类型可以是结构或类。结构不能提供自定义无参数构造函数,这是因为所有结构都已经为它们提供了无参数构造函数,并且默认行为它们无法更改。它并不意味着永远不能使用无参数构造函数创建结构。
答案 2 :(得分:1)
struct不能包含空构造函数(不带参数)。
不正确。结构将始终具有无参数构造函数。但是,您不能从自动获得的默认无参数构造函数中更改它。