.NET 泛型术语 - 开放/封闭、未绑定/构造

2024-03-18

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

  1. open
  2. closed
  3. unbound

我明白那个List<T>是开放的并且List<int>关闭了。但是相对于开放/封闭类型来说,真正的“构造”和“未绑定”是什么?


来自语言规范 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.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET 泛型术语 - 开放/封闭、未绑定/构造 的相关文章

随机推荐

  • 将 CSV 文件导入 PostgreSQL 时忽略引号?

    我正在尝试将制表符分隔的文件导入到我的 PostgreSQL 数据库中 我的文件中的字段之一是 标题 字段 其中偶尔包含实际的引号 例如 我的 tsv 可能如下所示 id title 5 Hello Bleah Foo 是的 标题中只有一个
  • 是否可以在 Mac 上使用 GUI 并行工具查看 git diff?

    我真的很讨厌使用默认的 UNIX 来可视化差异diff工具 是否可以使用 GUI 工具查看 git diff 该工具可以很好地并排显示本地和远程 类似于如何设置mergetool to be DiffMerge当你这样做时 git merg
  • 电子邮件未通过 1and1 smtp 主机 nodemailer caddy 发送

    在我的 Nodejs Express 应用程序中 当新用户注册时 我使用 NodeMailer 发送电子邮件 这是我的电子邮件配置 位于我的 config json 中 senderEmail email senderEmailPasswo
  • 如何更正此 sql 连接上的相关名称?

    我需要一个连接 从两个不同的表中生成三个具有相同名称的字段 当我尝试运行 sql 查询时 VS 给出以下错误 FROM 子句中的对象 PoliticalFigures 和 PoliticalFigures 具有相同的公开名称 使用相关名称来
  • 为什么每个字符串上都有空字符串? [复制]

    这个问题在这里已经有答案了 例如 gt gt gt s python gt gt gt s index 0 gt gt gt s index p 0 这是因为从索引 0 开始的长度为 0 的子串 python 等于空字符串 gt gt gt
  • java regex:从字符串中获取可能变化的子字符串

    我有一个像这样的字符串 Bangalore India Karnataka 我只想从这个字符串中提取子字符串 Bangalore 在这种情况下 正则表达式可以是 但问题是 字符串有时可能只是 Bangalore 那么在这种情况下 上面的正则
  • 为什么 Xcode 在创建地址清理构建时定义 _LIBCPP_HAS_NO_ASAN?

    Xcode 7 允许使用地址清理器来查找 C C 中的内存问题 https github com google sanitizers wiki AddressSanitizer https github com google sanitiz
  • 如何在 Eclipse 中启用 TODO/FIXME/XXX 任务标签?

    在我使用 Eclipse 的这些年里 直到现在我才知道 TODO FIXME XXX 注释标签应该出现在任务列表中 显然 默认情况下这是禁用的 因为只要我使用 Eclipse 我就一直在使用这些标签 而且我从未见过其中一个出现在任务列表中
  • C 中的嵌入式 perl、perlapio - 与 STDIO 的互操作性

    我刚刚意识到 PerlIO 层似乎不仅仅 或多或少 轻松地包装 stdio h 函数 如果我尝试使用通过以下方式解析的文件描述符PerlIO stdout and PerlIO fileno 对于 stdio h 中的函数 这会失败 例如
  • AutoFixture 和私有财产

    我可以指导吗汽车夹具 https github com AutoFixture还可以填充私有属性 并用特定属性进行注释 例如Ninject Inject 所有类别中 来源似乎只扫描公共属性 1 https github com AutoFi
  • 动态数组 - 如何增加数组的大小?

    我正在从文件中读取数字 然后尝试将它们添加到数组中 我的问题是如何增加数组的大小 例如 我认为也许可以这样做 include
  • 通过 CLI 更新 AWS API Gateway 资源策略的语法是否正确?

    我正在尝试通过 CLI 更新 API 网关实例上的资源策略 但我似乎找不到正确的 JSON 语法 在文档中 它说使用 补丁操作 据我了解 它需要一串 JSON 来表示策略 我尝试过缩小 JSON 转义 JSON 单引号 无引号 但似乎都不起
  • 如何卸载附加场景?

    我正在制作一款坦克战游戏 每轮后都会随机生成新的关卡 在我的游戏管理器中 我试图让回合从随机范围索引中的附加加载场景开始 然后以卸载场景结束 然后加载到新的随机场景中 然而 我所做的每一次尝试都会导致某种形式的错误 我一直被引导到 Load
  • 我如何在 Heroku 上安排“每周”工作?

    我在 Heroku 上部署了一个 Rails 应用程序 并使用 Heroku 调度程序插件成功处理日常工作 现在我想要一个每周工作 但调度程序附加组件不允许我每周选择 关于我如何实现这一目标的任何建议 我过去曾尝试使用 rufus sche
  • 折线(路线)悬停时的工具提示

    我已经在地图上标出了路线 使用一些坐标生成的路线 其中包含附加信息 速度 我希望当路线悬停时 会出现一个工具提示并显示这些坐标处的信息 速度 我很困惑如何显示速度的工具提示
  • 领域驱动设计中的 WCF 序列化和值对象模式

    Eric Evans 所著的 领域驱动设计 一书描述了称为值对象的模式 值对象的重要特征之一是它是不可变的 作为一个例子 我有一个值对象 Clinic 其中must有名字和id 为了使其成为值对象 我不提供名称和 ID 的设置器 另外 为了
  • 如何在sql server中的列中存储多个值

    我正在创建职位申请 在我的第一个表中 列是这是我的主表 ID Position jobDescription minExp maxExp LastDate InterviewDate Project HiringManager interv
  • 禁止 GCC 下的不兼容指针类型特定警告

    在 GCC 下的代码中 我收到了很多这两种类型的警告 warning passing argument 1 of foo from incompatible pointer type and warning assignment from
  • Android加载动画

    我正在寻找一些有关如何在 android 中创建加载动画的信息 是否可以创建这个动画 我可以在一个线程中调用这个动画并在另一个线程中结束 我正在寻找这个 尝试下面的代码 显示进度对话框 ProgressDialog mDialog new
  • .NET 泛型术语 - 开放/封闭、未绑定/构造

    NET 泛型术语有点含糊 更糟糕的是 它似乎在不同的来源中被模糊且不同地使用 基本上不清楚的是这 4 个术语之间的关系 与 类型 相关 open closed unbound 建 我明白那个List