Object Pascal 中的泛型:类型相等
Generics in Object Pascal: types equality
我正在尝试学习 Object Pascal(可能是为了业余项目),我发现 Object Pascal (FreePascal) 在 {$mode objfpc}
中支持泛型。它们看起来像 C# 泛型,但似乎存在差异。当我试图声明一个变量时:
uses Fgl;
...
SomeVariable: TFPSList<string>;
我遇到了关于意外“<”的错误,我删除了参数 <string>
并且它通过了编译。因此,似乎字符串列表和整数列表将以相同的方式声明:Something: TFPSList
。但这意味着 Pascal 将两个列表视为同一类型,对吧?在 C# 和其他语言中,类型参数修改所有类型并创建新类型。我知道旧的 Pascales 使用指针容器作为 "generic" 解决方案(TList
,等等),但是 TFPSList
是一个真正的泛型,但在声明中它看起来像简单的指针容器。现代 Pascal(FreePascal,Delphi)是否区分这些泛型类型(类似于 TFPSList
of int's/of string's)?如果我有 int 的通用列表,这是否意味着我可以将它传递给需要另一种类型列表的函数,并且 how/where 我应该检查项目类型:编译 time/runtime?我知道 is
和 as
关键字,但是如果列表为空怎么办?如何查看容器中物品的类型?
PS。如果这个问题听起来很奇怪或愚蠢,请原谅,我以前从未使用过 Pascal。
在 fgl 单元中,TFPSList 不是通用类型,它是一个普通类型 class,因此您不能对它进行特化,
使用 TFPGList,你的语法也是错误的,在 {$mode objfpc} 你需要使用 specialize 关键字来泛型,正确的语法是:
program Project1;
{$mode objfpc}
uses Classes,sysutils,fgl;
type
SomeType=specialize TFPGList<String>;
var
SomeVariable:SomeType;
begin
SomeVariable:=SomeType.Create;
SomeVariable.Add('some string');
end.
free pascal 在 Delphi 模式 {$MODE Delphi} 中也是通用的,语法不同,更多信息在这里 free pascal doc
我正在尝试学习 Object Pascal(可能是为了业余项目),我发现 Object Pascal (FreePascal) 在 {$mode objfpc}
中支持泛型。它们看起来像 C# 泛型,但似乎存在差异。当我试图声明一个变量时:
uses Fgl;
...
SomeVariable: TFPSList<string>;
我遇到了关于意外“<”的错误,我删除了参数 <string>
并且它通过了编译。因此,似乎字符串列表和整数列表将以相同的方式声明:Something: TFPSList
。但这意味着 Pascal 将两个列表视为同一类型,对吧?在 C# 和其他语言中,类型参数修改所有类型并创建新类型。我知道旧的 Pascales 使用指针容器作为 "generic" 解决方案(TList
,等等),但是 TFPSList
是一个真正的泛型,但在声明中它看起来像简单的指针容器。现代 Pascal(FreePascal,Delphi)是否区分这些泛型类型(类似于 TFPSList
of int's/of string's)?如果我有 int 的通用列表,这是否意味着我可以将它传递给需要另一种类型列表的函数,并且 how/where 我应该检查项目类型:编译 time/runtime?我知道 is
和 as
关键字,但是如果列表为空怎么办?如何查看容器中物品的类型?
PS。如果这个问题听起来很奇怪或愚蠢,请原谅,我以前从未使用过 Pascal。
在 fgl 单元中,TFPSList 不是通用类型,它是一个普通类型 class,因此您不能对它进行特化, 使用 TFPGList,你的语法也是错误的,在 {$mode objfpc} 你需要使用 specialize 关键字来泛型,正确的语法是:
program Project1;
{$mode objfpc}
uses Classes,sysutils,fgl;
type
SomeType=specialize TFPGList<String>;
var
SomeVariable:SomeType;
begin
SomeVariable:=SomeType.Create;
SomeVariable.Add('some string');
end.
free pascal 在 Delphi 模式 {$MODE Delphi} 中也是通用的,语法不同,更多信息在这里 free pascal doc