【问题标题】:Interfaces with Generics - Setting to NIL具有泛型的接口 - 设置为 NIL
【发布时间】:2023-04-08 17:47:01
【问题描述】:

我正在尝试在 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,以便释放接口?

【问题讨论】:

    标签: delphi generics delphi-2009


    【解决方案1】:

    您必须使用新的Default(T) 而不是nil,它返回泛型参数类型的默认值。对于接口,它是nil

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

    【讨论】:

    • D2009 中的泛型存在很多问题。他们中的大多数应该在下一次更新中得到解决,只要它出现。看起来这是其中之一。尝试将其报告给 QC,在此之前,此解决方案可能是您最好的解决方法。
    • 看到引用计数代码也被发出,令人惊喜。
    • @RyanVanIderstine 我希望如此!一个好的旧 FField :- nil 也会发出它。请注意,该问题在 D2010 中仍然存在,在 DXE2+ 中已修复(我手头没有 DXE)。
    猜你喜欢
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 2016-02-23
    • 1970-01-01
    相关资源
    最近更新 更多