Интерфейсы с Generics - установка на NIL - PullRequest
13 голосов
/ 25 мая 2009

Я пытаюсь реализовать clear в следующем примере кода в Delphi 2009.

interface
...
  TFoo<T : IInterface> = class(TObject)
    FField : T;
    procedure Clear;
  end;
...
implementation
...
procedure TFoo<T>.Clear;
begin
  // Line Below Results In
  //  E2010 Incompatible types: 'T' and 'Pointer' 
  FField := nil;
end;
...

Я мог бы понять ошибку времени компли, если «Т» не был ограничен. Но так как «T» должен быть интерфейсом, я бы подумал, что этот синтаксис будет иметь работал.

Можно ли установить FField на NIL, чтобы интерфейс мог быть освобожден?

1 Ответ

20 голосов
/ 25 мая 2009

Вместо nil необходимо использовать новый Default(T), который возвращает значение по умолчанию для универсального типа параметра. А для интерфейсов это nil

procedure TFoo<T>.Clear;
begin
  FField := Default(T);
end;
...