摘要:NDoc Reloading 首先面对的课题就是 .NET 2.0 中新增的泛型类型、泛型方法、可空类型等新增功能。由于可空类型应该可以算作泛型类型的一个特例,这里就不再多说了。
对于泛型类型,在 Type.IsGenericType 属性的 .NET 文档中,微软告诉我们一些术语,这里简单说明一些:
1)泛型类型定义(Generic Type Definition),就是最初定义该泛型类型的那个类型,比如 List<T>,Dictionary<TKEY, TValue> 这些类型。
2)上述这些类型括号中的这些 T, TKey, TValue 是泛型类型形参(Parameter)。
3)在实际运用 List<T> 或者 Dictionary<TKEY, TValue> 时,总是需要将这些 Parameters 指定为特定的类型,比如 List<String>, Dictionary<String, int>,则这些处于 Parameter 位置上的类型(string, int),就是泛型类型实参(Arguments)。
4)如果泛型类型定义中的所有 Parameters 都被替换为 Arguments 的话,就被称为封闭构造类型;
5)否则,只要还有任何一个 Parameter 没有被替换,就是开放构造类型。
泛型方法,与泛型类型类似,也有类似的几个术语。(参见 System.Reflection.MethodBase.IsGenericMethod 的文档中)
在研究这个问题之前,我从来没有区分过 Parameter 和 Argument 这两个英语词,都认为是“参数”,这次总算明白,Parameter 是“形参”,Argument 是“实参”。我认为搞清楚形参和实参,对理解较复杂的泛型是很重要的。.NET Framework SDK 的文档在这方面做的不够好,很多地方都翻译为“参数”,有时就需要对照英文原文来区分到底是 Parameter 还是 Argument。
上面所说的都是简单的情形。复杂的情况比如说嵌套:对于一个 Dictionary<TKey, TValue>,TKey 指定为 string,TValue 指定为另一个 List<T> 类型,就构成了一个嵌套的 Dictionary<String, List<T>>。
再比如说,Parameter 的相对性:这点不太好理解。比如 Type.GenericParameterPosition 属性中给出个这个例子:
public class B<T, U> { }
public class A<V>
{
public B<V, X> GetSomething<X>()
{
return new B<V, X>();
}
}
其中的红色部分 B<V, X>,V 的 GenericParameterPosition......[
阅读全文]