2011-02-02 102 views
15

.NET泛型术语有点含糊不清。更糟糕的是,它似乎在不同来源中使用含糊不清和不同。什么基本上是不明确的是这4个方面的关系(相对于 “类型”):.NET泛型术语 - 打开/关闭,未绑定/构建

  1. 开放
  2. 关闭
  3. 绑定
  4. 构建

我明白List<T>是打开并List<int>已关闭。但是,与开放/封闭类型有关的“构造”和“未绑定”究竟是什么?

回答

21

language specification

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的尝试,使用相关属性:IsGenericTypeIsGenericTypeDefinitionContainsGenericParameters

(根据语言规范,这些测试不是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. 
+0

实施例将足以:) – Konstantin 2011-02-02 16:27:35