是否可以在 Delphi 中声明具有通用值类型的 TDictionary?

Is it possible in Delphi to declare a TDictionary with a Generic value type?

能否Delphi做出如下说法?

TDictionary <T, TList <T>>

编译器不喜欢:

Undeclared identifier: 'T'

我在 uses 子句中添加了:

System.Generics.Collections;

更新:使用这段代码我遇到了这些问题:

interface

uses
  System.Generics.Collections;

type
  TListado = class(TObject)
  private
    FListado: TDictionary<T, V: TList<T>>;
    function GetListado: TDictionary<T,TList<T>>;
    procedure SetListado(const Value: TDictionary<T, TList<T>>);
  public
    property Listado: TDictionary<T,TList<T>> read GetListado write SetListado;
    function ReadItems(Cliente: T):TList<T>;
  end;

我更改了单元代码,但在它起作用之前,我不知道我失败了什么。

Undeclared identifier: 'T'

您似乎对泛型的工作原理存在根本性的误解。我强烈建议你read the documentation更仔细。

您正试图在需要 class 的特定实例化的上下文中使用 TDictionary。在您显示的代码中,编译器是正确的 T 是一种未知类型,可用于实例化您对 TDictionary.

的使用

你在任何地方使用 T,你需要指定一个你想要与字典一起使用的实际类型,例如:

interface

uses
  System.Generics.Collections;

type
  TListado = class(TObject)
  private
    FListado: TDictionary<Integer, TList<Integer>>;
    function GetListado: TDictionary<Integer, TList<Integer>>;
    procedure SetListado(const Value: TDictionary<Integer, TList<Integer>>);
  public
    property Listado: TDictionary<Integer, TList<Integer>> read GetListado write SetListado;
    function ReadItems(Cliente: Integer): TList<TInteger>;
  end; 

否则,您需要将 TListado 本身声明为具有自己参数的通用 class,然后您可以使用它来实例化 TDictionary,然后您可以指定一个在实例化 TListado 时输入该参数,例如:

interface

uses
  System.Generics.Collections;

type
  TListado<T> = class(TObject)
  private
    FListado: TDictionary<T, TList<T>>;
    function GetListado: TDictionary<T, TList<T>>;
    procedure SetListado(const Value: TDictionary<T, TList<T>>);
  public
    property Listado: TDictionary<T, TList<T>> read GetListado write SetListado;
    function ReadItems(Cliente: T): TList<T>;
  end; 
var
  list: TListado<Integer>;
begin
  list := TListado<Integer>.Create;
  ...
  list.Free;
end;