首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >泛型类型实现中的值和引用类型

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

Stack Overflow用户
提问于 2015-05-07 19:50:19
回答 3查看 1.9K关注 0票数 6

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

  1. 所有引用类型都基于Class
  2. 所有的值类型都基于struct
  3. 除值和引用类型之间的全局差异外,struct和class之间的主要区别是:
代码语言:javascript
复制
- No inheritance in struct
- The struct can not contain an empty constructor(without arguments)

  1. 有六种通用类型的基本实现:

  • 其中T:类==>the泛型参数必须是引用类型
  • 其中T:classA ==>the泛型参数必须是类classA的实例
  • 其中T:InterfaceA ==>泛型参数必须实现接口InterfaceA
  • 其中T:New() ==>泛型参数必须是类+有一个默认的空构造函数
  • 其中T:U ==>泛型参数必须导出类U或实现接口U
  • 其中T: struct ==>泛型参数必须是值类型

所以我需要知道:

  1. 如果我的结论是正确的?
  2. 我不明白以下几点之间的区别:

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

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

谢谢,

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-07 19:53:54

您所描述的是泛型约束。

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

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

代码语言:javascript
复制
Guid guid = new Guid();

所以如果你有:

代码语言:javascript
复制
public void Foo<T>() where T : new()

打电话是完全有效的

代码语言:javascript
复制
Foo<Guid>();
票数 10
EN

Stack Overflow用户

发布于 2015-05-07 19:53:43

泛型约束new()意味着该类型具有一个无参数构造函数。该类型可以是结构类型,也可以是类。structs不能提供自定义的无参数构造函数,这是因为所有结构都有一个已经为它们提供的无参数构造函数,其默认行为是它们无法更改的。这并不意味着不能用无参数构造函数来创建结构。

票数 2
EN

Stack Overflow用户

发布于 2015-05-07 20:10:23

结构不能包含空构造函数(没有参数)。

不是这样的。结构将总是有一个无参数的构造函数。但是,不允许从自动获得的默认无参数构造函数中更改它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30110417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档