我正在尝试学习Object (可能用于业余项目),我发现Object (FreePascal)支持{$mode objfpc}
中的泛型。它们看起来像C#泛型,但似乎有区别。当我试图声明一个变量时:
uses Fgl;
...
SomeVariable: TFPSList<string>;
我得到了错误,它告诉我意外的'<‘,我删除了参数<string>
,它通过编译。因此,似乎字符串的列表和int的列表将以相同的方式声明:Something: TFPSList
。但这意味着Pascal将这两个列表视为相同的类型,对吗?在C#和其他语言中,类型参数修改所有类型并创建新类型。我知道旧的Pascales使用指针容器作为“泛型”解决方案(TList
等),但是TFPSList
是一个真正的泛型,但是在声明中它看起来像一个简单的指针容器。现代Pascal (FreePascal,Delphi)是否区分了这些泛型类型(类似于int's/of string的TFPSList
)?如果我有int的泛型列表,这是否意味着我可以将它传递给函数,希望得到另一种类型的列表,以及如何/在哪里检查items类型:编译时间/运行时?我知道is
和as
关键字,但是如果list是空的怎么办?如何检查集装箱的项目类型?
PS。对不起,如果这个问题听起来奇怪或愚蠢,我以前从未用过帕斯卡。
发布于 2019-08-20 17:04:36
在fgl单元TFPSList中,它不是泛型类型,它是一个普通类,因此不能专门化它,使用TFPGList,您的语法也是错误的,在{$mode objfpc}中,您需要为泛型使用专门化关键字,正确的语法是:
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.
免费pascal在Delphi模式{$MODE Delphi}中也是通用的,具有不同的语法,更多信息在这里免费帕斯卡医生
https://stackoverflow.com/questions/57567748
复制相似问题