Delphi通用类用法编译错误

我正在为旧的Delphi XE代码库编写一些实用程序代码;为了使事情更简单和更安全,我创建了一种方法,该方法旨在包装通过参数传递的特定于类型的TProc<TReq>(其中TReq是泛型类类型)在更广泛的{{1} },之后应将其与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);

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

  

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

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


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

liuxiaoming110 回答:Delphi通用类用法编译错误

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

更改这种方法似乎已解决:

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
            if Assigned(reqRawModel) and not reqRawModel.ClassType.InheritsFrom(rec.PushModel) then
              raise EEvoHostException.CreateFmt('Impossibile convertire il modello di tipo %s in %s.',[reqRawModel.ClassName,rec.PushModel.ClassName]);
            // Azione
            if Assigned(action) then
              action(TReq(reqModel));
          end;
      PushHandlers.Add(rec);
    end;
本文链接:https://www.f2er.com/3138980.html

大家都在问