I searched about generic type in C#
and I made this conclusion:
我搜索了C#中的泛型类型,我做出了这样的结论:
- All reference types are based on
Class
- All value types are based on
struct
-
The main differences between struct and class, apart the global differences between value and reference type, are :
除了值和引用类型之间的全局差异之外,struct和class之间的主要区别是:
-
No inheritance in struct
结构中没有继承
-
The struct can not contain an empty constructor(without arguments)
结构不能包含空构造函数(不带参数)
-
- There are six basic implementations of a generic type:
所有参考类型均基于Class
所有值类型都基于struct
泛型类型有六种基本实现:
Where T: class ==>the generic parameter must be a reference type
其中T:class ==>泛型参数必须是引用类型
Where T:classA ==>the generic parameter must be an instance of the class classA
其中T:classA ==>泛型参数必须是类classA的实例
Where T:InterfaceA ==> the generic parameter must implement the interface InterfaceA
其中T:InterfaceA ==>泛型参数必须实现接口InterfaceA
Where T:New() ==> the generic parameter must be a class + have a default empty constructor
其中T:New()==>泛型参数必须是类+具有默认的空构造函数
Where T:U ==> the generic parameter must be derived the class U or implement the interface U
其中T:U ==>泛型参数必须从类U派生或实现接口U.
Where T: struct ==> the generic parameter must be a value type
其中T:struct ==>泛型参数必须是值类型
So I need to know:
所以我需要知道:
- If my conclusion is correct?
- I can't understand the difference between :
如果我的结论是正确的?
我无法理解之间的区别:
where T: New() ==> class with empty constructor
其中T:New()==>带有空构造函数的类
where T: class, New() ==> class with empty constructor
其中T:class,New()==>带有空构造函数的类
Why the second form is used? Why we don't just use the first one?
为什么使用第二种形式?为什么我们不只是使用第一个?
Thanks,
3 个解决方案
#1
What you're describing are generic constraints.
您所描述的是通用约束。
Where T:New() ==> the generic parameter must be a class + have a default empty constructor
其中T:New()==>泛型参数必须是类+具有默认的空构造函数
No, that just says "the type argument must have a parameterless constructor". That actually includes all value types. Even though you couldn't declare your own parameterless constructors for structs before C# 6, you could always call them. For example:
不,那只是说“类型参数必须有一个无参数构造函数”。这实际上包括所有价值类型。即使您无法在C#6之前为结构声明自己的无参数构造函数,也可以随时调用它们。例如:
Guid guid = new Guid();
So if you have:
所以如果你有:
public void Foo<T>() where T : new()
it's perfectly valid to call
打电话完全有效
Foo<Guid>();
#2
The generic constraint new()
means that the type has a parameterless constructor. That type could be either a struct or a class. structs cannot provide a custom parameterless constructor, that is because all structs have a parameterless constructor already provided for them, with a default behavior that they cannot change. It doesn't mean that structs can never be created with a parameterless constructor.
泛型约束new()表示该类型具有无参数构造函数。该类型可以是结构或类。结构不能提供自定义无参数构造函数,这是因为所有结构都有一个已经为它们提供的无参数构造函数,并且默认行为无法更改。这并不意味着永远不能使用无参数构造函数创建结构。
#3
The struct can not contain an empty constructor(without arguments).
结构不能包含空构造函数(不带参数)。
Not true. The struct will always have a parameterless constructor. You are not however allowed to change it from the default parameterless constructor that you get automatically.
不对。该结构将始终具有无参数构造函数。但是,您不能从自动获得的默认无参数构造函数中更改它。
#1
What you're describing are generic constraints.
您所描述的是通用约束。
Where T:New() ==> the generic parameter must be a class + have a default empty constructor
其中T:New()==>泛型参数必须是类+具有默认的空构造函数
No, that just says "the type argument must have a parameterless constructor". That actually includes all value types. Even though you couldn't declare your own parameterless constructors for structs before C# 6, you could always call them. For example:
不,那只是说“类型参数必须有一个无参数构造函数”。这实际上包括所有价值类型。即使您无法在C#6之前为结构声明自己的无参数构造函数,也可以随时调用它们。例如:
Guid guid = new Guid();
So if you have:
所以如果你有:
public void Foo<T>() where T : new()
it's perfectly valid to call
打电话完全有效
Foo<Guid>();
#2
The generic constraint new()
means that the type has a parameterless constructor. That type could be either a struct or a class. structs cannot provide a custom parameterless constructor, that is because all structs have a parameterless constructor already provided for them, with a default behavior that they cannot change. It doesn't mean that structs can never be created with a parameterless constructor.
泛型约束new()表示该类型具有无参数构造函数。该类型可以是结构或类。结构不能提供自定义无参数构造函数,这是因为所有结构都有一个已经为它们提供的无参数构造函数,并且默认行为无法更改。这并不意味着永远不能使用无参数构造函数创建结构。
#3
The struct can not contain an empty constructor(without arguments).
结构不能包含空构造函数(不带参数)。
Not true. The struct will always have a parameterless constructor. You are not however allowed to change it from the default parameterless constructor that you get automatically.
不对。该结构将始终具有无参数构造函数。但是,您不能从自动获得的默认无参数构造函数中更改它。