【问题标题】:Delphi incompatible typesDelphi 不兼容的类型
【发布时间】:2015-04-14 08:04:54
【问题描述】:

我有一个非常奇怪的错误,我尝试重新启动我的 IDE,但它没有修复它。

我创建了一个如下所示的界面:

myInterface = interface
 ['{delphi guid key here}'] (CTRL+ALT+G)
 function getDataPCE : IDataPCE;
 property dataPCE : IDataPCE read getDataPCE;
 (some other properties that works)
end;

然后我创建了继承自这个接口的对象

myObject = class(TInterfacedObject, myInterface)
 private
  ... 
  function getDataPCE : IDataPCE;
  ...
 public
  ...
  property dataPCE : IDataPCE read getDataPCE;
  ...
 end;

“...”表示其他一些属性和功能,但与此无关。

我收到此错误:“不兼容的类型”

我该如何解决这个问题?

编辑

    IInfoNotisReservation = interface
      ['{AE5CEC31-B2CE-4A3D-9CFE-6393646E4A04}']

      function getNumberPCE : String;
      function getDataPCE(numRegister : String; numPCEFormated : String): IRioPiece;
      procedure setNumberPCE(NumberPCE: String);
      function getRegName : String;
      procedure setRegName(RegName: String);
      function getRegKey : String;
      procedure setRegKey(RegKey: String);

      property NumberPCE : String read getNumberPCE write setNumberPCE;
      property RegName : String read getRegName write setRegName;
      property RegKey : String read getRegKey write setRegKey;
      property DataPCE : IRioPiece read getDataPCE;
    end;

type
  TInfoNotisReservation = class(TInterfacedObject, IInfoNotisReservation)

  private
    DataBase  : IDataBase;
    SuperRio  : ISuperRio;
    RioN      : IRio;
    fPCENum    : String;

    function getDataPCE(numRegister : String; numPCEFormated : String): IRioPiece;
    function getNumberPCE: string;
    function getRegKey: string;
    function getRegName: string;
    procedure setNumberPCE(NumberPCE: string);
    procedure setRegKey(RegKey: string);
    procedure setRegName(RegName: string);
    procedure setRioN(Registre: string);
  public
    Constructor Create;
    property DataPCE : IRioPiece read getDataPCE;
    property NumberPCE : String read getNumberPCE write setNumberPCE;
    property RegName : String read getRegName write setRegName;
    property RegKey : String read getRegKey write setRegKey;

end;

function TInfoNotisReservation.getDataPCE(numRegister,
  numPCEFormated: String): IRioPiece;
begin
  setRioN(numRegister);
  Result := RioN.GetPieceByID(RioN.PieceNumberToID(NumPCEFormated).Item[0].ID, FLAG_IGNORE_SECURITY);
end;

【问题讨论】:

  • 问题中的代码编译得很好。请提供一个 MCVE 来证明您的问题。就目前而言,这个问题将作为题外话关闭,因为问题中的代码没有展示您报告的问题。
  • 你到底想要什么?我不明白为什么它说不兼容的类型。这里有我用于此实现的所有内容...
  • 请提供演示问题的 MCVE。问题中的代码不会产生您报告的错误。哦,还有一件事。始终逐字报告错误消息,并始终指出它们发生的行。
  • 我的 IDE 表明问题出现在我的接口声明中的属性行。它突出显示“属性 DataPCE:IDataPCE 读取 getDataPCE;”带有消息不兼容的类型。如您所见,我的 getDataPCE 返回相同的类型
  • @CiucaS 不,我们不想要所有代码。我们只需要足够的代码来演示问题。所以我们希望将代码减少到最小的复制。但我们也想要可以编译的代码。

标签: delphi


【解决方案1】:

为了帮助您了解如何提问,这里是您应该提交的 MCVE。

type
  IRioPiece = interface
  end;

  IInfoNotisReservation = interface
    ['{AE5CEC31-B2CE-4A3D-9CFE-6393646E4A04}']
    function getDataPCE(numRegister: String; numPCEFormated: String): IRioPiece;
    property dataPCE: IRioPiece read getDataPCE; // ERROR HERE
  end;

begin
end.

这会导致这个错误:

[dcc32 错误] E2008 类型不兼容

原因是IRioPiece 类型属性的属性getter 必须是不接受任何参数且返回类型为IRioPiece 的函数。但是您的 getter 函数需要两个参数,并且它们需要来自某个地方。如上所述,当您访问该属性时,不会提供这些参数。

因此您可以通过将getDataPCE 的声明更改为:

function getDataPCE: IRioPiece;

但这几乎肯定是错误的解决方案。大概您将这些参数声明为getDataPCE,因为您需要提供它们。在这种情况下,您无法删除它们。这意味着您不能声明由getDataPCE 支持的简单属性dataPCE。我的猜测是您只需要删除 dataPCE 属性即可。

当然,您可以像这样声明array property

property dataPCE[numRegister: String; numPCEFormated: String]: IRioPiece 
  read getDataPCE;

这意味着您可以像这样访问该属性:

dataPCE := resvervation.dataPCE[numRegister, numPCEFormatted];

但对我来说,这太过分了。我认为最好使用函数来访问它。

结论

删除dataPCE 属性,让接口的消费者调用getDataPCE

【讨论】:

  • 但我需要这些参数
  • 确实如此。这意味着属性不合适。
  • 是的,好的,所以它可以工作,但有点奇怪,它不适用于属性。我删除了它并将函数放在公共声明中,所以它会像那样工作,但是是的.. :/ 感谢您的帮助
  • FWIW,我最希望你在这个答案中仔细查看 MCVE。我希望您能够意识到生成能够证明问题的最少代码的重要性。如果你这样做了,我想你很可能会自己发现问题。
  • 哦,好的,现在我明白了,这太明显了,天哪>_>我现在需要用力面对手掌......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多