【发布时间】:2011-09-30 05:24:36
【问题描述】:
我正在阅读 Anders Hejlsberg 等人撰写的《C# 编程语言》第 4 版。
有几个定义有点扭曲:
未绑定的泛型类型:泛型类型声明本身表示未绑定的泛型类型...
构造类型:包含至少一个类型参数的类型称为构造类型。
开放类型:开放类型是涉及类型参数的类型。
封闭型:封闭型是不是开放型的类型。
未绑定类型:指非泛型类型或未绑定泛型类型。
绑定类型:指非泛型类型或构造类型。 [注释] ERIC LIPPERT:是的,非泛型类型被认为是绑定的和未绑定的。
问题 1,下面我列出的内容是否正确?
int //non-generic, closed, unbound & bound,
class A<T, U, V> //generic, open, unbound,
class A<int, U, V> //generic, open, bound, constructed
class A<int, int, V> //generic, open, bound, constructed
class A<int, int, int> //generic, closed, bound, constructed
问题 2,书上说 “未绑定类型是指由类型声明声明的实体。 未绑定的泛型类型本身不是类型,它不能用作变量、参数或返回值的类型,也不能用作基类型。 唯一可以引用未绑定泛型类型的构造是 typeof 表达式(第 7.6.11 节)。” 很好,但是下面是一个可以编译的小测试程序:
public class A<W, X> { }
// Q2.1: how come unbounded generic type A<W,X> can be used as a base type?
public class B<W, X> : A<W, X> { }
public class C<T,U,V>
{
// Q2.2: how come unbounded generic type Dictionary<T, U> can be used as a return value?
public Dictionary<T,U> ReturnDictionary() { return new Dictionary<T, U>(); }
// Q2.3: how come unbounded generic type A<T, U> can be used as a return value?
public A<T, U> ReturnB() { return new A<T, U>(); }
}
【问题讨论】:
-
关于我对第二个问题的了解。您只能将 B 类和 C 类给定参数用于模板类类型,因此您只能完全绑定使用它们。
-
是的,这可能有点误导。显然,您可以在父未绑定类型(具有相同的未绑定泛型参数)的 定义 中使用未绑定类型,但您永远不能自己实例化它。
-
@nawfal 这个问题本身就是重复的。
-
@Izzy 是的,但是这个标题的方式,我相信那个问题更能说明这一点。