Почему у меня есть универсальный анонимный метод несовместимого типа?
В процессе обучения я использую книгу Ника Ходжеса "Кодирование в 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 ответ:
Это потому, что вывод типа в Delphi является плохим. На самом деле он мог бы вывести
T
из первого параметра, но, к сожалению, компилятор не удовлетворяется тогда для второго параметра, который идеально соответствовал бы.Вы должны явно указать параметр type следующим образом:
TgrsObj.Using<TStringStream>(TStringStream.Create, procedure(ss: TStringStream) begin ss.WriteString('test string'); Memo1.Lines.Text := ss.DataString; end);