为什么Delphi 7不允许扩展类型的TList

Sku*_*tch 1 delphi casting tlist

我已经创建了几个简单的列表(以及整数列表和颜色列表)但是当我尝试创建一个"扩展"列表时它表示无效的类型转换,即使我已经对前两个列表使用了类似的类型转换(无论我在哪里都会抛出错误使用Extended()类型转换).

Type
  TAExtList = Class(TObject)
  Private
    FList: TList;
    Procedure SetExt(Index: Integer; Value: Extended);
    Function GetCnt: Integer;
    Function GetExt(Index: Integer): Extended;
  Public
    Constructor Create;
    Destructor Destroy; Override;
    Function Add(Value: Extended): Integer;
    Function Insert(Index: Integer; Value: Extended): Integer;
    Procedure Delete(Index: Integer);
    Procedure Clear;
    Function IndexOf(Value: Extended): Integer;
    Property Count: Integer Read GetCnt;
    Property Extendeds[Index: Integer]: Extended Read GetExt Write SetExt; Default;
  End;

Function TAExtList.Add(Value: Extended): Integer;
Begin
  Result := FList.Add(Pointer(Value));
End;
Run Code Online (Sandbox Code Playgroud)

MBo*_*MBo 8

二者IntegerTColor具有相同的尺寸(4个字节)作为Pointer在Delphi 7,这就是为什么显式转换是可能的.

docWiki:

变量类型转换
您可以将任何变量转换为任何类型,只要它们的大小相同且不将整数与实数混合.

Extended实际上,它的大小是10个字节,你不能把它投射到Pointer.而且,没有足够的地方.

PS请注意,新的Delphi版本包含相当方便的工具 - 泛型 - 只需定义和创建TList<Extended>.