Delphi 2009中的Generic TList <>在IndexOf上崩溃

Mar*_*ski 3 delphi generics indexof delphi-2009

我已经看到许多提到Delphi 2009泛型中的错误,但从来没有预料到在Update 3中会出现如此基本的错误,不会少.如果列表包含一个或多个项目,则在通用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;
Run Code Online (Sandbox Code Playgroud)

例外情况是"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;
Run Code Online (Sandbox Code Playgroud)

这当然使得通用TList几乎完全没用.由于Update 3似乎没有修复此错误,除了升级到XE之外,我还有其他办法吗?

Rod*_*ddy 8

看看这个问题.为什么TList.Remove()会产生EAccessViolation错误?

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

TList<TTest>.Create(TComparer<TTest>.Default);
Run Code Online (Sandbox Code Playgroud)


Mas*_*ler 5

这是默认构造函数中的一个错误TObjectList<T>,我认为它已在更新3中修复.如果您仍然看到它,请使用不同的构造函数或只更新到D2010或XE,它肯定是修复的.(如果你想使用泛型,你真的想要脱离D2009.)

  • 我知道,我知道:)但XE升级的价格不是爱好者的口袋改变.我经常使用TObjectList,并希望泛型可以让我避免不断的类型转换.我真的没想到问题会如此早地浮出水面. (3认同)
  • 如果您想要使用泛型,那么"你真的想要脱离D2009"的+1.我还在D2009上,并试图使用它们遇到很多麻烦.有太多事情应该有效,但却没有. (2认同)