Delphi 2009ジェネリックのバグについて多くの言及を見てきましたが、Update3でこれほど基本的なものが失敗するとは思っていませんでした。リストに1つ以上の項目が含まれている場合、汎用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;
例外は「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にアップグレードする以外の方法はありますか?