Оператор «как» для ограниченных универсальных типов - PullRequest
3 голосов
/ 06 августа 2009

Рассмотрим:

TTest <T : class, constructor> = class 
public
  function CreateMyObject : T;
end;
function TTest<T>.CreateMyObject : T;
var
  Obj : TObject;
begin
  Obj := T.Create; 
  Result := (Obj as T);
end;

Почему это невозможно? Компилятор выдает сообщение об ошибке «Оператор не применим к этому типу» для оператора как . T ограничен типом класса, так что это должно работать, не так ли?

Спасибо за помощь.

Ответы [ 3 ]

3 голосов
/ 06 августа 2009

Я столкнулся с той же проблемой и решил ее, добавив метод низкоуровневого указателя-копирования в класс в качестве обходного пути:

  TTest <T : class, constructor> = class
  private
    function _ToGeneric(AItem: TObject): T; inline; //inline, so it's a little faster
  public
    function CreateMyObject : T;
  end;

  function TTest<T>.CreateMyObject : T;
  var
    Obj : TObject;
  begin
    Obj := T.Create;
    Result := _ToGeneric(Obj);
  end;

  function TTest<T>._ToGeneric(AItem: TObject): T;
  begin
    System.Move(AItem,Result,SizeOf(AItem))
  end;
1 голос
/ 06 августа 2009

Это известная проблема с компилятором Delphi. Пожалуйста, проголосуйте за это, если вы хотите, чтобы это было исправлено. В то же время, вы можете обойти это, сказав

Result := (Obj as TClass(T));
0 голосов
/ 06 августа 2009

Не уверен, почему это не работает. Я предполагаю, что в реализации обобщений все еще есть некоторые странности / ошибки

Но работает следующий код:

// Class definition
function CreateMyObject<T : class, constructor>  : T;


// Class implementation
function TForm1.CreateMyObject<T>: T;
var
  Obj : T;
begin
  Obj := T.Create;
end;
...