2010-11-18 12 views
3

Ich habe viele Erwähnungen von Bugs in Delphi 2009 Generics gesehen, aber nie erwartet, etwas so grundlegend zu scheitern in Update 3, nicht weniger. Der Aufruf IndexOf auf einem generischen TList oder TObjectList verursacht eine Zugriffsverletzung, wenn die Liste enthält 1 oder mehr Items:Generische TList <> in Delphi 2009 Absturz auf 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; 

Die Ausnahme ist „EAccessViolation: Zugriffsverletzung bei Adresse 0048974C in Modul‚testbed.exe‘Lesen der Adresse. 00000000"

mit Debug-DCU Kompilieren führt zu einem Problem in generics.collections.pas - das FComparer Mitglied nicht zugeordnet:

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; 

das macht natürlich die allgemeine TList fast völlig nutzlos. Da Update 3 diesen Fehler anscheinend nicht behoben hat, habe ich einen anderen Rückgriff als auf XE zu aktualisieren?

Antwort

5

Dies ist ein Fehler im Standardkonstruktor von TObjectList<T>, und ich dachte, es wurde in Update 3 behoben. Wenn Sie es immer noch sehen, verwenden Sie einen anderen Konstruktor oder einfach auf D2010 oder XE aktualisieren, wo es definitiv behoben ist. (Und Sie werden wirklich aus D2009 aussteigen wollen, wenn Sie mit Generika sowieso arbeiten wollen.)

+2

+1 Erstellen „Sie wollen wirklich weg von D2009 erhalten, wenn Sie mit Generika arbeiten wollen sowieso“. Ich bin immer noch auf D2009 und stieß auf viele Probleme, wenn ich versuchte, sie zu benutzen. Es gibt zu viele Dinge, die funktionieren sollten, aber nicht. – lkessler

+3

Ich weiß, ich weiß :) Aber der Preis von XE Upgrade ist kein Taschengeld für einen Hobbyisten. Ich benutze oft TObjectList und habe nur gehofft, dass Generika mir die konstante Typisierung ersparen würden. Ich habe wirklich nicht erwartet, dass die Probleme so früh auftauchen. –