Delphi XE:类构造函数不会在使用泛型的类中调用

Sch*_*ann 11 delphi generics class-constructors delphi-xe

考虑以下示例(我使用的是Delphi XE):

program Test;

{$APPTYPE CONSOLE}

type
  TTestClass<T> = class
  private
    class constructor CreateClass();
  public
    constructor Create();
  end;

class constructor TTestClass<T>.CreateClass();
begin
  // class constructor is not called. this line never gets executed!
  Writeln('class created');
end;

constructor TTestClass<T>.Create();
begin
  // this line, of course, is printed
  Writeln('instance created');
end;

var
  test: TTestClass<Integer>;

begin
  test := TTestClass<Integer>.Create();
  test.Free();
end.
Run Code Online (Sandbox Code Playgroud)

从不调用类构造函数,因此不会打印"创建类"行.但是,如果我删除泛化并TTestClass<T>进入标准类TTestClass,一切都按预期工作.

我是否遗漏了仿制药?或者它根本不起作用?

对此的任何想法都会受到关注!

谢谢, - 斯特凡 -

Dav*_*nan 11

我可以确认这是一个错误.如果类的唯一实例化在.dpr文件中,则类构造函数不会运行.如果您创建另一个单元,即单独的.pas文件,并TTestClass<Integer>从那里实例化a ,那么您的类构造函数将运行.

我已提交QC#103798.

  • 仍未在XE8 @LURD中修复 (2认同)

Hen*_*röm 9

看起来像编译器错误.如果将TTestClass声明和实现移动到单独的单元,则相同的代码可用.

unit TestClass;

interface
type
  TTestClass<T> = class
  private
    class constructor CreateClass();
  public
    constructor Create();
  end;

var
  test: TTestClass<Integer>;

implementation

class constructor TTestClass<T>.CreateClass();
begin
  Writeln('class created');
end;

constructor TTestClass<T>.Create();
begin
  Writeln('instance created');
end;

end.
Run Code Online (Sandbox Code Playgroud)

  • 重要的是课程的实例化.在您的示例中,这意味着声明`test`的位置.如果将`test`声明移回.dpr文件,则类构造函数不会触发. (2认同)