.NET泛型术语有点含糊不清.更糟糕的是 - 它似乎在不同来源中含糊不清地使用.基本上不清楚的是这4个术语之间的关系(与"类型"有关):
我明白这List<T>是开放的并且List<int>是封闭的.但是真正与开放/封闭类型相关的"构造"和"未绑定"是什么?
Ani*_*Ani 22
从语言规范:
4.4构造类型
泛型类型声明本身表示一种未绑定的泛型类型,它通过应用类型参数用作形成许多不同类型的"蓝图" .类型参数写在尖括号(<和>)内,紧跟在泛型类型的名称后面.包含至少一个类型参数的类型称为 构造类型.构造类型可以在可以出现类型名称的语言中的大多数地方使用.未绑定的泛型类型只能在typeof-expression(第7.6.11节)中使用.[...]
4.4.2开放和封闭类型
所有类型都可以分为 开放类型或封闭类型.开放类型是涉及类型参数的类型.进一步来说:
•类型参数定义开放类型.
•当且仅当其元素类型为开放类型时,数组类型才是开放类型.
•当且仅当其一个或多个类型参数是开放类型时,构造类型才是开放类型.当且仅当其一个或多个类型参数或其包含类型的类型参数是开放类型时,构造的嵌套类型才是开放类型.
封闭类型是不是开放类型的类型.[...]
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> { .. }
Run Code Online (Sandbox Code Playgroud)
而这里的领带,在与反射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.
Run Code Online (Sandbox Code Playgroud)