为什么.NET中的泛型类型在TypeDef中有一个条目,在TypeSpec中有另一个开放类型条目?
当泛型被添加到.NET时,是不是简单地扩展了带有签名的TypeDef?
发布于 2011-01-31 16:16:25
让我们来看看这两种不同的类型:
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表中找到一个条目,以组成Fighter的矩形数组。但如果你写道:
var type = typeof (Foo<>);将要使用的Foo的定义,它没有实例化:没有用于此用法的TypeSpec条目。另一方面,如果你写:
var type = typeof (Foo<string>);这里将使用我们前面讨论过的相同的TypeSpec。
要回答您的最后一个问题,在本例中,并不是要扩展TypeDef来添加通用信息:而是要使用标准表来支持新的类型构造(TypeSpec)。
另一方面,还创建了一些其他表来处理新的泛型构造,如GenericParam,以支持泛型参数的定义,如TFoo,GenericParamConstraints用于将约束信息添加到泛型参数,以及MethodSpec,它的方法就像TypeSpec对于TypeDef:一种使用方法定义中的专用方法的方式。此外,方法签名也被修改为能够支持方法的泛型。
https://stackoverflow.com/questions/4848389
复制相似问题