Delphi XE4通用包装中的无效类型

时间:2019-06-25 08:45:17

标签: delphi generics

出于某种原因,我想在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.

2 个答案:

答案 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
    ;

否则,您将遍历字典对。