作者:夜夜0603 | 来源:互联网 | 2023-01-22 13:20
我最近阅读了一些VCL源代码行,并找到了该TCaption
类型的定义:
TCaption = type string;
我一直认为它只是string
类型的另一个名称,我认为它的定义如下:
TCaption = string;
所以,我找了关于关键字的文档type
,我发现了这个:
type Name = Existing type
引用现有类型,例如新名称的字符串.
type Name = type Existing type
这与上面的效果相同,但确保在运行时,此类型的变量由其新类型名称标识,而不是现有的类型名称.
阅读之后,我仍然感到困惑,我不明白"......确保在运行时,这种类型的变量由他们的新类型名称识别......"实际上意味着.
有人可以对此有所了解吗?
1> Tom Brunberg..:
请考虑以下代码,并注意该过程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)
.
2> MBo..:
类型声明就像
TCaption = type string;
创建具有不同RTTI信息的新类型.var
如果string
需要类型,它也不能用作函数参数.
新的RTTI信息"......确保在运行时,此类型的变量由其新类型名称标识......".因此,如果您尝试获取实例的类型名称TCaptiOnSame= string;
,您将获得string
,而对于TCaption
类型变量,您将获得TCaption
要获得更准确的信息,最好参考官方帮助