是否可以在 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;
能否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;