如何在Delphi中声明自定义类型?

如何在Delphi中声明自定义类型?,delphi,types,Delphi,Types,我想声明一个自定义数据类型,以提高代码的可读性。其目的是保持该类型清洁,不受其他Ansistring的任何干扰。但德尔福似乎不支持它 type TKMLocaleCode = type AnsiString; ... snip ... procedure A; var A,B: TKMLocaleCode; C: AnsiString; begin A := 'eng'; //<<-- I expect an error here A := C; //&l

我想声明一个自定义数据类型,以提高代码的可读性。其目的是保持该类型清洁,不受其他Ansistring的任何干扰。但德尔福似乎不支持它

type
  TKMLocaleCode = type AnsiString;

... snip ...

procedure A;
var 
  A,B: TKMLocaleCode;
  C: AnsiString; 
begin
  A := 'eng'; //<<-- I expect an error here
  A := C; //<<-- I expect an error here too

  B := TKMLocaleCode('eng'); //<<-- I expect no error here
end;
类型
TKMLocaleCode=类型AnsiString;
... 剪
程序A;
变量
A、 B:TKMLocaleCode;
C:翻译;
开始

答:"eng";// 你不应该在你犯错误的地方犯错误,但是你最初的技术无论如何也不会实现你的目标。请注意,
TFileName
与您的字符串类型一样是一种独特的字符串类型,但它可以在任何需要普通字符串的地方使用。
type
声明更适合于为一个类型建立不同的RTTI,以便在设计时可用于不同类型的属性编辑器


要真正创建一个独特的类型,请尝试声明一个包含数据的字段的记录。记录与其他任何内容都不兼容,即使它们与其他类型具有相同的结构。要使您的记录与相同类型的其他值具有可比性,请通过在记录声明中提供
Equal
NotEqual
方法来重载比较运算符。要允许通过类型转换而不是通过普通赋值创建不同类型,请提供一个
显式
运算符,而不是
隐式

,您可以声明一个记录,然后使用运算符重载来提供希望支持的运算符:

type
  TKMLocaleCode = record
  strict private
    FValue: AnsiString;
  public
    class operator Explicit(const Value: string): TKMLocaleCode;
  end;

class operator TKMLocaleCode.Explicit(const Value: AnsiString): TKMLocaleCode;
begin
  Result.FValue := Value;
end;

显然,您希望添加更多功能,但此记录满足问题中所述的要求。

AnsiString的类型?我不认为这是一个有效的声明。@RobKennedy我以前从未见过
类型的AnsiString
,但由于它编译时省略了比较,只是出于兴趣,它会是什么?调试器在分析。。。