2010-11-18 94 views
3

我见过很多提及Delphi 2009中泛型的错误,但从来没有想过在Update 3中失败的基本原理,没有。在通用调用的TList的IndexOf或TObjectList导致访问冲突如果列表中包含1个或多个项目:通用TList <>在德尔福2009年崩溃在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之外,我是否有追索权?

回答

5

这是缺省构造函数TObjectList<T>中的一个错误,我认为它在更新3中得到了修复。如果您仍然看到它,请使用其他构造函数或仅更新到D2010或XE,它在这里肯定是固定的。 (如果你想用泛型工作,你真的想要脱离D2009。)

+2

+1“你真的想下车D2009的。如果你想使用泛型的工作”。我仍然在D2009上遇到很多麻烦,试图使用它们。有太多的东西应该工作,但没有。 – lkessler 2010-11-19 00:34:56

+3

我知道,我知道:)但XE升级的价格不是为爱好者而改变的。我使用TObjectList很多,只是希望泛型能让我避免不断的类型转换。我真的没有想到问题会很早出现。 – 2010-11-20 14:09:22