【发布时间】:2011-06-20 01:59:40
【问题描述】:
.NET 泛型术语有点含糊。更糟糕的是——它似乎在不同的来源中被模棱两可地使用。基本上不清楚的是这 4 个术语之间的关系(与“类型”相关):
- 打开
- 关闭
- 未绑定
- 已建成
我了解List<T> 已打开,List<int> 已关闭。但是,相对于开放/封闭类型,真正的“构造”和“未绑定”是什么?
【问题讨论】:
.NET 泛型术语有点含糊。更糟糕的是——它似乎在不同的来源中被模棱两可地使用。基本上不清楚的是这 4 个术语之间的关系(与“类型”相关):
我了解List<T> 已打开,List<int> 已关闭。但是,相对于开放/封闭类型,真正的“构造”和“未绑定”是什么?
【问题讨论】:
4.4 构造类型
一个泛型类型声明,本身, 表示 未绑定的泛型类型 被用作“蓝图”来形成许多 不同类型,通过申请 输入参数。类型参数是 写在尖括号()内 紧跟在泛型类型的名称之后。一种类型,包括 至少一个类型参数被称为 构造类型。构造类型 可以在大部分地方使用 类型名称可以使用的语言 出现。未绑定的泛型类型可以 只能在一个内使用 表达式类型(第 7.6.11 节)。 [...]
4.4.2 开放和封闭类型
所有类型都可以分类为 开放类型或封闭类型。一个开放的 type 是涉及类型的类型 参数。更具体地说:
• 一个 type 参数定义了一个开放类型。
• 数组类型是开放类型,如果并且 只有当它的元素类型是开放的 输入。
• 构造类型是开放的 当且仅当它的一个或多个 类型参数是开放类型。一种 构造的嵌套类型是开放的 当且仅当它的一个或多个 类型参数或类型参数 其包含的类型是开放的 输入。
封闭类型是一种 不是开放式。 [...]
4.4.3 绑定和非绑定类型
unbound type 一词是指非泛型 类型或未绑定的泛型类型。这 术语绑定类型指的是 非泛型类型或构造 类型。未绑定类型是指 由类型声明声明的实体。 未绑定的泛型类型本身不是 类型,不能用作类型 变量、参数或返回 值,或作为基本类型。唯一的 构造其中未绑定的泛型 可以引用的类型是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.
【讨论】:
IsGenericType的示例部分。对于新属性IsConstructedGenericType,请参阅thread I just started。