【问题标题】:.NET generics terminology - open/closed, unbound/constructed.NET 泛型术语 - 打开/关闭、未绑定/构造
【发布时间】:2011-06-20 01:59:40
【问题描述】:

.NET 泛型术语有点含糊。更糟糕的是——它似乎在不同的来源中被模棱两可地使用。基本上不清楚的是这 4 个术语之间的关系(与“类型”相关):

  1. 打开
  2. 关闭
  3. 未绑定
  4. 已建成

我了解List<T> 已打开,List<int> 已关闭。但是,相对于开放/封闭类型,真正的“构造”和“未绑定”是什么?

【问题讨论】:

    标签: .net generics


    【解决方案1】:

    来自language specification

    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 结合起来: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.
    

    【讨论】:

    猜你喜欢
    • 2011-09-30
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    相关资源
    最近更新 更多