出于某种原因,我想在TDictionary<string,T>
周围使用包装器。但是,当我尝试通过for
遍历地图时,编译器会说:
[dcc32 Error] Unit1.pas(23): E2010 Incompatible types: 'T' and 'System.Generics.Collections.TPair<System.string,Unit1.TMyMapWrapper<T>.T>'
如何修改通用类型声明以使像这样的简单代码可编译?
这是我的简化代码:
unit Unit1;
interface
implementation
uses
Generics.Collections
;
type
TMyMapWrapper<T> = class
private
fMap : TDictionary<string,T>;
public
procedure foo;
end;
procedure TMyMapWrapper<T>.foo;
var
item : T;
begin
for item in fMap do
;
end;
end.
答案 0 :(得分:5)
如果X
的类型为TDictionary<A, B>
,则枚举项的类型将为TPair<A, B>
,而不是B
。
var
item: TPair<string, T>;
begin
for item in fMap do // will compile
如果您只想枚举字典的值(类型为T
),请使用
var
val: T;
begin
for val in fMap.Values do // will compile
答案 1 :(得分:3)
如果要遍历字典的值,则必须明确说明:
for item in fMap.Values do
;
否则,您将遍历字典对。