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