在类型定义中使用时,`type`关键字实际意味着什么?

时间:2017-08-19 16:34:00

标签: delphi types keyword

我最近阅读了 VCL 源代码的一些行,并找到了TCaption类型的定义:

TCaption = type string;

我一直认为这只是string类型的另一个名称,我认为它定义如下:

TCaption = string;

所以,我已经找到关于type关键字的documentation,我发现了这个:

  
      
  1. 类型名称=现有类型
      通过新的名称引用现有类型,例如字符串

  2.   
  3. 类型名称=类型现有类型
      这与上面的效果相同,但确保在运行时,此类型的变量由标识   他们的新类型名称,而不是现有的类型名称。

  4.   

阅读之后,我仍然感到困惑,我不明白" ...确保在运行时,此类型的变量由其新类型名称标识......" 实际上意味着。

有人可以对此有所了解吗?

2 个答案:

答案 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参数的类型必须相同

在上文中,类型Tbstring兼容,因为你可以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