首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么.NET中的泛型类型在TypeDef中有一个条目,在TypeSpec中有另一个开放类型条目?

为什么.NET中的泛型类型在TypeDef中有一个条目,在TypeSpec中有另一个开放类型条目?
EN

Stack Overflow用户
提问于 2011-01-31 15:04:30
回答 1查看 232关注 0票数 3

为什么.NET中的泛型类型在TypeDef中有一个条目,在TypeSpec中有另一个开放类型条目?

当泛型被添加到.NET时,是不是简单地扩展了带有签名的TypeDef?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-31 16:16:25

让我们来看看这两种不同的类型:

代码语言:javascript
复制
public class Foo<TFoo> {}

public class Fighter {}

对于这两个定义,就像任何其他类型一样,TypeDef表中将有一个条目。在这种情况下,在GenericParam表中也会有一个条目将Foo链接到TFoo。

现在,在大多数情况下,当使用Foo时,您不会直接使用它的定义,因为它不是很有趣,您会希望使用Foo的实例化。因此,如果你这样写:

代码语言:javascript
复制
new Foo<string> ();

TypeSpec表中会有一个条目,指定您正在使用带有一个通用参数的Foo类型: string。如果你写下同样的事情:

代码语言:javascript
复制
public class Bar<TBar> {
    public Foo<TBar> Foo;
}

编译器还必须创建TypeSpec条目,指定您使用带有一个泛型参数的Foo类型: TBar。您可以将TypeSpec视为一种类型的专门化,但它们并不是泛型实例所特有的。如果你这样写:

代码语言:javascript
复制
var type = typeof (Fighter[,]);

您还将在TypeSpec表中找到一个条目,以组成Fighter的矩形数组。但如果你写道:

代码语言:javascript
复制
var type = typeof (Foo<>);

将要使用的Foo的定义,它没有实例化:没有用于此用法的TypeSpec条目。另一方面,如果你写:

代码语言:javascript
复制
var type = typeof (Foo<string>);

这里将使用我们前面讨论过的相同的TypeSpec。

要回答您的最后一个问题,在本例中,并不是要扩展TypeDef来添加通用信息:而是要使用标准表来支持新的类型构造(TypeSpec)。

另一方面,还创建了一些其他表来处理新的泛型构造,如GenericParam,以支持泛型参数的定义,如TFoo,GenericParamConstraints用于将约束信息添加到泛型参数,以及MethodSpec,它的方法就像TypeSpec对于TypeDef:一种使用方法定义中的专用方法的方式。此外,方法签名也被修改为能够支持方法的泛型。

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

https://stackoverflow.com/questions/4848389

复制
相关文章

相似问题

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