2012-03-30 16 views
2

In Delphi 2009 hatte ich bisher keine größeren Probleme mit Generics (unter Verwendung von Generics.Collections-Listen, ohne spezielle Generics-Features).TObjectList <T> .Contains verursacht Zugriffsverletzung in Delphi 2009

Jetzt habe ich festgestellt, dass dieser Code ein AV in der Zeile verursacht, die auf MyList.Contains zugreift.

Der Fehler verschwindet, wenn ich TMyList = class(TList<TMyEntry>);

Sollte ich vermeiden, TObjectList<T> oder ist etwas anderes in meinem Code diesen Fehler verursacht?

type 
    TMyEntry = class(TStringlist); 
    TMyList = class(TObjectList<TMyEntry>); 

procedure TListTests.TestAV; 
var 
    Entry: TMyEntry; 
    MyList: TMyList; 
begin 
    MyList := TMyList.Create; 
    try 
    Entry := TMyEntry.Create; 

    MyList.Add(Entry); 

    Assert(MyList.Contains(Entry)); // <--- AV 

    finally 
    MyList.Free; 
    end; 
end; 
+5

Verwandte: http://stackoverflow.com/questions/4216733/ generic-tlist-in-delphi-2009-crash-on-indexof –

+0

@VilleKrumlinde Ich würde nicht nur sagen, verwandt, ich würde sagen, es ist genau das selbe Ing. 'TObjectList <>' leitet sich von 'TList <>' ab, also werden Fehler in 'TList <>' auch in 'TObjectList <>' angezeigt. – hvd

Antwort

5

Dies ist die Lösung, basierend auf dem linked answer:

Änderung

MyList := TMyList.Create; 

zu

MyList := TMyList.Create(TComparer<TMyEntry>.Default); 
+2

Colour mich überrascht, dass der Compiler hier nicht nur das Richtige tut 2009. Dies ist übrigens in XE und XE2 behoben. Warum aktualisierst du nicht einfach? –