Добрый день.
Затеял небывалое - кастинг процедур на дженерике.
Код:
unit Unit4;
interface
uses
  Vcl.Forms, System.Classes, System.Generics.Collections;
type
  TForm4 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    fNotifyEvent: TNotifyEvent;
    function CastMethod<T>(P: Pointer): T;
  public
    { Public declarations }
  end;
var
  Form4: TForm4;
implementation
{$R *.dfm}
procedure DataModuleOnEvent(Sender: TObject);
begin
//
end;
{ TForm4 }
function TForm4.CastMethod<T>(P: Pointer): T;
var
  M: TMethod;
begin
  M.Data := nil;
  M.Code := P;
  Result := T(M);
end;
procedure TForm4.FormCreate(Sender: TObject);
begin
  fNotifyEvent := CastMethod<TNotifyEvent>(@DataModuleOnEvent);
end;
end.
Проблема в том, что при компиляции ругается на Invalid typecast в функции кастинга, в строке Result := T(M). Причем, если убрать оттуда дженерик и указывать приведение к тому же TNotifyEvent - то все хорошо:
function TForm4.CastMethod(P: Pointer): TNotifyEvent;
var
  M: TMethod;
begin
  M.Data := nil;
  M.Code := P;
  Result := TNotifyEvent(M);
end;
Вопрос: Что я делаю не так? Я, вообще, законными вещами занимаюсь?
Добавлено через 12 минут и 39 секунд:А, ну я понял... Если передаваемый тип будет не процедурным, то, действительно, получится лажа вида Result := String(M).
Тогда получается, вопрос звучит по-другому: как-то можно указать, что <T> должен быть именно процедурным? Попробовал заменить T на TProc = reference to procedure - то же самое...