我最近阅读了 VCL 源代码的一些行,并找到了TCaption
类型的定义:
TCaption = type string;
我一直认为这只是string
类型的另一个名称,我认为它定义如下:
TCaption = string;
所以,我已经找到关于type
关键字的documentation,我发现了这个:
类型名称=现有类型
通过新的名称引用现有类型,例如字符串。- 醇>
类型名称=类型现有类型
这与上面的效果相同,但确保在运行时,此类型的变量由标识 他们的新类型名称,而不是现有的类型名称。
阅读之后,我仍然感到困惑,我不明白" ...确保在运行时,此类型的变量由其新类型名称标识......" 实际上意味着。
有人可以对此有所了解吗?
答案 0 :(得分:11)
请考虑以下代码,并注意过程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)
的参数。
答案 1 :(得分:8)
类型声明,如
TCaption = type string;
创建具有不同RTTI信息的新类型。如果需要var
类型,它也不能用作string
函数参数。
新的RTTI信息" ...确保在运行时,此类型的变量由其新类型名称标识..."。因此,如果您尝试获取TCaptionSame = string;
实例的类型名称,则会获得string
,而对于TCaption
类型变量,您将获得TCaption
要获得更准确的信息,最好引用official help