约束泛型类型的“As”运算符

时间:2009-08-06 08:59:35

标签: delphi generics delphi-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;

为什么这不可能?编译器会为 as 运算符生成“不适用于此类型的运算符”错误消息。 T被约束为类类型,所以这应该有效,不应该吗?

感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

我遇到了同样的问题并通过向类中添加一个低级指针复制方法解决了它作为一种解决方法:

  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 :(得分:1)

这是Delphi编译器的a known issue。如果你想看到它修好,请投票支持。在此期间,您可以通过说

来解决这个问题
Result := (Obj as TClass(T));

答案 2 :(得分:0)

不确定为什么它不起作用。我假设在泛型实现中仍然存在一些怪癖/错误。

但以下代码有效:

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


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