来自语言规范 http://www.microsoft.com/downloads/en/details.aspx?FamilyID=DFBF523C-F98C-4804-AFBD-459E846B268E:
4.4 构造类型
泛型类型声明本身,
表示一个未绑定的泛型类型那
被作为“蓝图”来形成许多
不同类型,通过申请类型参数。类型参数是
写在尖括号内( )
紧跟在泛型类型的名称之后。一个类型包括
至少有一个类型参数称为 a构造型。构造类型
可以在大部分地方使用
类型名称可以使用的语言
出现。未绑定的泛型类型可以
只能在一个时间内使用
typeof 表达式(第 7.6.11 节)。
[...]
4.4.2 开放式和封闭式
所有类型都可以分类为开放类型 or 封闭型。一个开放的
type 是一个涉及 type 的类型
参数。进一步来说:
• A
type 参数定义一个开放类型。
• 数组类型是开放类型,如果且
仅当其元素类型为开放时
类型。
• 构造类型是开放的
当且仅当其中一个或多个
类型参数是开放类型。 A
构造嵌套类型是开放的
当且仅当其中一个或多个
类型参数或类型参数
其包含类型是开放的
类型。
封闭类型是这样一种类型
不是开放式的。
[...]
4.4.3 绑定和非绑定类型
期限未绑定类型指的是非泛型
类型或未绑定的泛型类型。这
学期绑定类型指的是
非泛型类型或构造的
类型。未绑定类型是指
由类型声明声明的实体。
未绑定的泛型类型不是其本身
类型,并且不能用作类型
变量、参数或返回值
值,或作为基本类型。唯一的
构造其中未绑定的泛型
可以引用的类型是typeof
表达式(第 7.6.11 节)。
这是我想到的一个例子:
// Foo<T> is an unbound generic type.
class Foo<T> { .. }
// Bar<K> is an unbound generic type.
// Its base-class Foo<K> is a constructed, open generic type.
class Bar<K> : Foo<K> { .. }
// IntFoo is not a generic type.
// Its base-class Foo<int> is a constructed, closed generic type.
class IntFoo : Foo<int> { .. }
这里尝试使用相关属性将其与反射 API 结合起来:IsGenericType
, IsGenericTypeDefinition
and ContainsGenericParameters
(根据语言规范,这些测试不能 100% 预测每种“类型”)。
+----------+---------------------+-----------+--------------+-------------------+
| Name | Kind | IsGenType | IsGenTypeDef | ContainsGenParams |
+----------+---------------------+-----------+--------------+-------------------+
| Foo<> | Unbound | TRUE | TRUE | TRUE |
| Foo<>* | Constructed, open | TRUE | FALSE | TRUE |
| Foo<int> | Constructed, closed | TRUE | FALSE | FALSE |
| IntFoo | Not generic | FALSE | FALSE | FALSE |
+----------+---------------------+-----------+--------------+-------------------+
* = Bar<>'s base type.