バグのようです。
デバッグ DCU を使用してコンパイルすると (正気を失いたくない場合は、通常はそうしないでください)、比較子の呼び出しが間違っていることがわかります。比較関数の 3 番目の値 (場合によってはオプション) が設定されていないため、アクセス違反が発生します。
そのため、メソッド ポインターをジェネリック リストに入れることはできない可能性があります。
次の作品をOK:
uses
Generics.Defaults;
type
TForm4 = class(TForm)
...
private
procedure myNotifyEvent(Sender: TObject);
end;
TComparer<T> = class (TInterfacedObject, IComparer<T>)
public
function Compare(const Left, Right: T): Integer;
end;
implementation
uses
Generics.Collections;
var
list: TList<TNotifyEvent>;
begin
list := TList<TNotifyEvent>.Create(TComparer<TNotifyEvent>.Create);
try
list.Add(myNotifyEvent);
list.Remove(myNotifyEvent);
finally
FreeAndNil(list);
end;
end;
procedure TForm4.myNotifyEvent(Sender: TObject);
begin
ShowMessage('event');
end;
{ TComparer<T> }
function TComparer<T>.Compare(const Left, Right: T): Integer;
begin
Result := 0;
end;
独自の比較子を定義する必要がありますが、もう少し知性がある可能性があります;-)。