我在Delphi2009泛型中见过很多关于bug的描述,但从没想过在更新3中会出现如此基本的错误。如果在泛型TList或TObjectList上调用IndexOf,则如果该列表包含1个或多个项,则会导致访问冲突:
type
TTest = class( TObject );
procedure DoTest;
var
list : TObjectList< TTest >;
t : TTest;
begin
list := TObjectList< TTest >.Create;
try
t := TTest.Create;
list.IndexOf( t );
list.Add( t );
list.IndexOf( t );
finally
list.Free;
end;
end;
异常为“EAccessViolation:Access violation at address 0048974C in module'testbed.exe”。读取地址00000000“
使用调试DCU编译会导致generics.collections.pas中出现问题-未分配FComparer成员:
function TList<T>.IndexOf(const Value: T): Integer;
var
i: Integer;
begin
for i := 0 to Count - 1 do
if FComparer.Compare(FItems[i], Value) = 0 then
Exit(i);
Result := -1;
end;
当然,这使得通用TList几乎完全没有用处。由于更新3似乎没有修复这个bug,除了升级到XE之外,我还有别的办法吗?