Недопустимые типы в универсальной оболочке Delphi XE4 - PullRequest
0 голосов
/ 25 июня 2019

Я хочу использовать обертку вокруг 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 ]

5 голосов
/ 25 июня 2019

Если 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
3 голосов
/ 25 июня 2019

Если вы хотите перебрать значения словаря, вы должны прояснить это:

  for item in fMap.Values do
    ;

В противном случае вы перебираете пары словаря.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...