这两种语法有什么区别?
Type
AnIntType = Integer;
AnotherIntType = Type Integer;
我注意到第二个版本在程序参数(如Var / Const)中使用时兼容性较差,但不是AnIntType和AnotherIntType完全相同吗?
答案 0 :(得分:6)
第一个声明只是类型Integer
的别名,第二个声明是基于整数的新类型,并强制编译器创建一个名为AnotherIntType
的新的不同类型
答案 1 :(得分:5)
当您声明一个与现有类型相同的类型时, 编译器将新类型标识符视为旧类型的别名。 因此,鉴于声明:
type TValue = Real; var X: Real; Y: TValue;
X和Y属于同一类型;在运行时,没有办法 将
TValue
与Real
区分开来。这通常很少 结果,但如果您要定义新类型的目的是利用 运行时类型信息,例如,关联属性编辑器 具有特定类型的属性 - 区别 “不同名称”和“不同类型”变得重要。在这种情况下, 使用语法:type newTypeName = type KnownType
例如:
type TValue = type Real;
强制编译器创建一个名为
TValue
的新的不同类型。
需要创建一个不同的类型而不是别名,这并不常见。但是,偶尔会有用途。我能想到的最好的例子是考虑Windows类型HDC
和HWND
。这些都是指针大小的不透明值。因此,合理地定义它们似乎是合理的:
type
HDC = Pointer;
HWND = Pointer;
然而,这意味着这些类型的变量可以相互分配。将HDC
传递给GetDC()
是没有意义的,反之亦然,将HWND
传递给ReleaseDC()
毫无意义。
所以你可以对这些类型进行delcare:
type
HDC = type Pointer;
HWND = type Pointer;
现在语言类型系统可以防止你犯这样的平庸错误,让你继续进行真正的编程。
Andreas和Remy在对问题的评论中给出了另一个很好的例子:
TCaption
实现了一个不同的属性编辑器,允许在对象检查器中键入时进行实时更新。这可能是因为type TCaption = type string
。type TCaption = string
无法做到这一点。