Почему у меня есть универсальный анонимный метод несовместимого типа?


В процессе обучения я использую книгу Ника Ходжеса "Кодирование в Delphi". Я использую Delphi 2010 .

В главе об анонимных методах он приводит очень интересный пример подделки .NET using. Когда я пытаюсь скомпилировать пример, я получаю ошибку от компилятора. Пожалуйста, помогите мне получить результат.

Мой класс:

type
  TgrsObj = class
    class procedure Using<T: class>(O: T; Proc: TProc<T>); static;
  end;

implementation

{ TgrsObj }

class procedure TgrsObj.Using<T>(O: T; Proc: TProc<T>);
begin
  try
    Proc(O);
  finally
    O.Free;
  end;
end;

Вот как я пытаюсь использовать приведенный выше код:

procedure TForm4.Button1Click(Sender: TObject);
begin
  TgrsObj.Using(TStringStream.Create,
    procedure(ss: TStringStream)
    begin
      ss.WriteString('test string');
      Memo1.Lines.Text := ss.DataString;
    end);
end;

Ошибка компилятора:

[DCC Error] uMain.pas(36): E2010 Incompatible types: 'TProc<ugrsObj.Using<T>.T>' and 'Procedure'
1 3

1 ответ:

Это потому, что вывод типа в Delphi является плохим. На самом деле он мог бы вывести T из первого параметра, но, к сожалению, компилятор не удовлетворяется тогда для второго параметра, который идеально соответствовал бы.

Вы должны явно указать параметр type следующим образом:

TgrsObj.Using<TStringStream>(TStringStream.Create, procedure(ss: TStringStream)
  begin
    ss.WriteString('test string');
    Memo1.Lines.Text := ss.DataString;
  end);