我见过很多人提到过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:模块'testbed.exe'中地址0048974C的访问冲突。读取地址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几乎完全无用。由于Update 3似乎没有修复此错误,因此除了升级到XE之外,我是否还有其他方法?

最佳答案

看看这个问题。 Why is TList.Remove() producing an EAccessViolation error?

特别是,尝试像这样创建您的TList

TList<TTest>.Create(TComparer<TTest>.Default);

10-06 11:22