Delphi通用类用法编译错误

问题描述 投票:0回答:1

我正在为旧的Delphi XE代码库编写一些实用程序代码;为了使事情更简单和安全,我创建了一种方法,该方法用于包装通过更广泛的TProc<TReq>中的参数传递的特定于类型的TReq(其中TProc<TObject>是泛型类类型)稍后还有一个第三方组件,以及TClass(TReq)和一个附加的字符串参数:

type
  TREvoHostConnectionOptions = record
    // [...]
    procedure OnPush<TReq:class>(const pushMethod: string; const action: TProc<TReq>);
  end;

// [...]

procedure TREvoHostConnectionOptions.OnPush<TReq>(const pushMethod: string; const action: TProc<TReq>);
    var
      rec: TRPushHandler;
    begin
      rec.PushMethod := pushMethod;
      rec.PushModel := TClass(TReq);
      rec.Handler :=
        procedure(reqRawModel: TObject)
          var
            reqModel: TReq;
          begin
            // Conversione modello richiesta
            reqModel := reqRawModel as TReq;
            if Assigned(reqRawModel) and not Assigned(reqModel) then
              raise EEvoHostException.Create(Format('Impossibile convertire il modello di tipo %s in %s.', [reqRawModel.ClassName, TClass(TReq).ClassName]));
            // Azione
            if Assigned(action) then
              action(reqModel);
          end;
      PushHandlers.Add(rec);
    end;

先前的方法编译成功,并且如果这样调用,将按预期工作(尽管将TObject作为通用类型违反了方法的目的:]]

opts.OnPush<TObject>('Test', procedure (reqModel: TObject) begin (* ... *) end);

但是,如果在测试表单单元中,我使用特制的模型类来调用它:

  type
    TTestModel = class(TObject)
      strict private
        _a, _b: string;
      public
        property A: string read _a write _a;
        property B: string read _b write _b;
    end;

我在调用单元的完全不相关的行(以及完全不同且完全不相关的方法)中收到以下编译器错误:

[[DCC错误] WndMain.pas(96):E2010不兼容的类型:'TTestModel'和'TObject'

*仅当出现此特定错误时才会发生位移,如果我在同一文件中的其他任何地方引入了人工语法错误,则会在正确的行中报告该错误。


有什么想法吗?这是编译器错误吗?如果可以,有什么办法可以解决它?不幸的是,我无法删除方法上的:class约束,因为否则,方法内发生的TClass(TReq)转换会(在逻辑上)引发另一个有关TReq不受约束的类或接口类型的编译错误。

我正在为旧的Delphi XE代码库编写一些实用程序代码;为了使事情更简单和更安全,我创建了一种方法,用于包装特定于类型的TProc (其中TReq是通用...

delphi generics delphi-xe
1个回答
0
投票

经过进一步研究,问题似乎是由方法中的as转换引起的,即使它是在错误的文件中报告的。

© www.soinside.com 2019 - 2024. All rights reserved.