我看到很多关于Delphi 2009泛型的错误提及,但从未想过如此基础的问题会在Update 3中失败。如果列表包含1个或多个项目,则调用泛型TList或TObjectList上的IndexOf将导致访问冲突:
type
TTest = class( TObject );
procedure DoTest;
var
list : TObjectList< TTest >;
t : TTest;
begin
list := TObjectList< TTest >.Create;
try
t := TTest.Create;
list.IndexOf( t ); // No items in list, correct result -1
list.Add( t );
list.IndexOf( t ); // Access violation here
finally
list.Free;
end;
end;
异常信息为"EAccessViolation: Access violation at address 0048974C in module 'testbed.exe'. Read of address 00000000"
使用debug DCUs编译会导致泛型集合文件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似乎没有修复这个错误,除了升级到XE,我还有其他选择吗?