Подтвердить что ты не робот

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.

Конструктор класса никогда не вызывается и, следовательно, строка 'class created' не печатается. Однако, если я удалю обобщение и сделаю TTestClass<T> в стандартный класс TTestClass, все будет работать так, как ожидалось.

Я что-то пропустил с помощью дженериков? Или это просто не работает?

Любые мысли об этом будут восприняты!

Спасибо, --Stefan -

4b9b3361

Ответ 1

Похож на ошибку компилятора. Тот же код работает, если вы переместите объявление 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.

Ответ 2

Я могу подтвердить, что это ошибка. Если единственным экземпляром класса является файл .dpr, конструктор класса не запускается. Если вы создадите другой блок, т.е. Отдельный .pas файл, и создайте экземпляр TTestClass<Integer> оттуда, то ваш конструктор классов запустится.

Я отправил QС# 103798.