考虑以下示例(我正在使用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.

永远不会调用类构造器,因此不会打印“创建的类”行。
但是,如果删除通用化并将TTestClass<T>设置为标准类TTestClass,那么一切都会按预期进行。

我是否缺少泛型的东西?还是根本行不通?

任何想法都将不胜感激!

谢谢,
-斯蒂芬-

最佳答案

看起来像一个编译器错误。如果将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.

关于Delphi XE : class constructor doesn't get called in a class using generics,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9501451/

10-09 16:57