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?我知道 isas 关键字,但是如果列表为空怎么办?如何查看容器中物品的类型?

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