.NET泛型术语有点含糊不清。更糟糕的是,它似乎在不同来源中使用含糊不清和不同。什么基本上是不明确的是这4个方面的关系(相对于 “类型”):.NET泛型术语 - 打开/关闭,未绑定/构建
- 开放
- 关闭
- 绑定 构建
我明白List<T>
是打开并List<int>
已关闭。但是,与开放/封闭类型有关的“构造”和“未绑定”究竟是什么?
.NET泛型术语有点含糊不清。更糟糕的是,它似乎在不同来源中使用含糊不清和不同。什么基本上是不明确的是这4个方面的关系(相对于 “类型”):.NET泛型术语 - 打开/关闭,未绑定/构建
我明白List<T>
是打开并List<int>
已关闭。但是,与开放/封闭类型有关的“构造”和“未绑定”究竟是什么?
4.4构造类型
一个通用类型声明,其本身 表示该 用作“蓝图”来形成未结合的通用型很多 不同类型,通过应用 类型参数。紧跟在通用类型名称后面的尖括号(<和>) 中写入的类型参数为 。包含 的类型至少有一个类型参数称为 构造类型。构造类型 可用于 语言中的大多数地方,其中类型名称可以显示为 。未绑定的泛型类型 只能在 typeof表达式(第7.6.11节)中使用。 [...]
4.4.2打开和关闭的类型
所有类型可以被分类为 开放类型或封闭类型。开放的 类型是涉及 参数的类型。更具体地说:
•A 类型参数定义了一个开放类型。
•阵列类型是开放类型if和 仅当其元素类型是开放的 类型时。
•构造类型是开放的 类型当且仅当其中一个或多个 类型参数是开放类型。 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
和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.
实施例将足以:) – Konstantin 2011-02-02 16:27:35