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

时间:2011-01-31 07:04:30

标签: .net metadata generics typedef

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

当将泛型添加到.NET时,是否只是使用签名扩展了TypeDef?

1 个答案:

答案 0 :(得分:6)

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

public class Foo<TFoo> {}

public class Fighter {}

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

现在,大多数情况下,当使用Foo时,你不会直接使用它的定义,因为它不是很有趣,你会想要使用Foo的实例化。所以,如果你写:

new Foo<string> ();

TypeSpec表中会有一个条目,指定您使用的类型为Foo,其中包含一个通用参数:string。如果你写的话也是一样:

public class Bar<TBar> {
    public Foo<TBar> Foo;
}

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

var type = typeof (Fighter[,]);

你还可以在TypeSpec表中找到一个条目来组成一个矩形阵列的战斗机。但如果你写:

var type = typeof (Foo<>);

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

var type = typeof (Foo<string>);

我们将在此处使用我们之前讨论过的相同TypeSpec。

要回答你的上一个问题,在这种特殊情况下,不要扩展TypeDef来添加通用信息:它是关于使用标准表来支持新类型构造(TypeSpec)。

另一方面,创建了一些其他表来处理新的通用构造,例如GenericParam,以支持泛型参数(如TFoo)的定义,GenericParamConstraints将约束信息添加到泛型参数,以及MethodSpec,它是to Type TypeSpec是什么类型TypeDef:一种从方法定义中使用专门方法的方法。此外,还修改了方法签名,以便能够支持方法的通用性。