Delphi XE: class constructor doesn't get called in a class using generics

情到浓时终转凉″ 提交于 2019-11-30 07:27:22

问题


Consider the following example (I am using 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.

The class constructur is never called and hence the line 'class created' is not printed. However, if I remove the generalisation and make TTestClass<T> into a standard class TTestClass, everything works as expected.

Am I missing something out with generics? Or it simply doesn't work?

Any thoughts on this would be apprechiated!

Thanks, --Stefan--


回答1:


Looks like a compiler bug. The same code works if you move the TTestClass declaration and implementation to a separate unit.

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.



回答2:


I can confirm that this is a bug. If the only instantiation of the class is in the .dpr file, then the class constructor does not run. If you create another unit, i.e. a separate .pas file, and instantiate a TTestClass<Integer> from there, then your class constructor will run.

I have submitted QC#103798.



来源:https://stackoverflow.com/questions/9501451/delphi-xe-class-constructor-doesnt-get-called-in-a-class-using-generics

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!