泛型接口 - 将其设置为NIL

13

我正在尝试在Delphi 2009中实现以下示例代码中的“clear”功能。

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”没有被限制会出现编译时错误。但既然“T”必须是一个接口,我本以为这个语法会起作用。
有没有办法将FField设置为NIL,以便释放接口呢?
1个回答

20

你需要使用新的Default(T)来代替nil,它会返回泛型参数类型的默认值。对于接口,可以使用nil

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

在D2009中,泛型存在许多问题。其中大部分问题预计将在下一个更新中解决,无论何时发布。看起来这是其中之一。尝试向QC报告此问题,在那之前,这个解决方案可能是你最好的解决方法。 - Mason Wheeler
1
令人愉快的是,还发现了引用计数代码也被生成了。 - Ryan VanIderstine
@RyanVanIderstine 我也这么希望!一个好老的 FField:-nil 也将发出它。请注意,该问题仍存在于 D2010 中,在 DXE2+ 中已经修复(我手头没有 DXE)。 - Arnaud Bouchez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接