Delphi XE: конструктор класса не вызывается в классе с использованием обобщений - PullRequest
11 голосов
/ 29 февраля 2012

Рассмотрим следующий пример (я использую 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, все будет работать как положено.

Я что-то упустил из-за обобщений?Или это просто не работает?

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

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

Ответы [ 2 ]

11 голосов
/ 29 февраля 2012

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

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

9 голосов
/ 29 февраля 2012

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