这个问题在这里已有答案:
我最近阅读了一些VCL源代码行,并找到了TCaption
类型的定义:
TCaption = type string;
我一直认为它只是string
类型的另一个名称,我认为它的定义如下:
TCaption = string;
所以,我找了关于documentation关键字的type
,我发现了这个:
- type Name =现有类型 引用现有类型,例如新名称的字符串。
- type Name = type现有类型 这与上面的效果相同,但确保在运行时,此类型的变量由其新类型名称标识,而不是现有的类型名称。
阅读之后,我仍然感到困惑,我不明白“......确保在运行时,这种类型的变量由他们的新类型名称识别......”实际上意味着。
有人可以对此有所了解吗?
类型声明就像
TCaption = type string;
创建具有不同RTTI信息的新类型。如果需要var
类型,它也不能用作string
函数参数。
新的RTTI信息“......确保在运行时,此类型的变量由其新类型名称标识......”。因此,如果您尝试获取TCaptionSame = string;
实例的类型名称,您将获得string
,而对于TCaption
类型变量,您将获得TCaption
要获得更准确的信息,最好参考official help
请考虑以下代码,并注意过程Check()
有一个var
参数:
type
Ta = string; // type alias
Tb = type string; // compatible but distinct new type
procedure Check(var s: string);
begin
ShowMessage(s);
end;
procedure TMain.Button2Click(Sender: TObject);
var
a: Ta;
b: Tb;
begin
a := 'string of type Ta,';
b := 'string of type Tb.';
Check(a);
Check(b);
end;
Check(b)
导致编译器错误:E2033实际和正式var参数的类型必须相同
在上面,类型Tb
与string
兼容,因为你可以f。恩。指定a := b
,但它的不同之处在于type identifier
(在引擎盖下)具有不同的值,因此不被接受作为Check(var s: string)
的参数。