我们来看看这两种不同的类型:
public class Foo<TFoo> {}
public class Fighter {}
Run Code Online (Sandbox Code Playgroud)
对于这两个定义,就像任何其他类型一样,TypeDef表中会有一个条目.在这种情况下,GenericParam表中还会有一个条目将Foo链接到TFoo.
现在,大多数时候,当使用Foo时,你不会直接使用它的定义,因为它不是很有趣,你会想要使用Foo的实例化.所以,如果你写:
new Foo<string> ();
Run Code Online (Sandbox Code Playgroud)
TypeSpec表中会有一个条目,指定您使用的类型为Foo,其中包含一个通用参数:string.如果你写的话也是一样的:
public class Bar<TBar> {
public Foo<TBar> Foo;
}
Run Code Online (Sandbox Code Playgroud)
编译器还必须创建TypeSpec条目,指定您使用类型Foo和一个通用参数:TBar.您可以将TypeSpec视为类型的特化,但它们并不特定于泛型实例.如果你写:
var type = typeof (Fighter[,]);
Run Code Online (Sandbox Code Playgroud)
您还可以在TypeSpec表中找到一个条目,以组成一个矩形阵列的战斗机.但如果你写:
var type = typeof (Foo<>);
Run Code Online (Sandbox Code Playgroud)
将使用的Foo的定义,它没有实例化:没有TypeSpec条目用于此用法.另一方面,如果你写:
var type = typeof (Foo<string>);
Run Code Online (Sandbox Code Playgroud)
我们将在此处使用我们之前讨论过的相同TypeSpec.
要回答你的上一个问题,在这种特殊情况下,不要扩展TypeDef来添加通用信息:它是关于使用标准表来支持新类型结构(TypeSpec).
另一方面,创建了一些其他表来处理新的通用构造,例如GenericParam,以支持泛型参数的定义,如TFoo,GenericParamConstraints将约束信息添加到泛型参数,以及MethodSpec,这是方法什么TypeSpec是TypeDef:一种从方法定义中使用专门方法的方法.方法签名也被修改为能够支持方法的通用性.
| 归档时间: |
|
| 查看次数: |
216 次 |
| 最近记录: |