【问题标题】:How solve Incompatible types error (E2010) with class casting in Delphi?如何在 Delphi 中通过类转换解决不兼容类型错误(E2010)?
【发布时间】:2013-06-09 05:43:48
【问题描述】:

我有这样的代码:

TBase = class

end;

TClassA = class(TBase)

end;

TClassB = class(TBase)

end;

现在我需要一个带参数的过程,这个过程必须接受 TBase 对象和所有 TBase 子对象(TClassA 和 TClassB),我已经尝试过:

procedure MyProcedure(item: TBase);

但如果我尝试传递 TClassA 或 TClassB,则会收到错误消息:“E2010 不兼容的类型:'TBase' 和 'class of TClassA'”。

我不明白我的错误。 谢谢

注意:在发布之前我尝试找到类似的问题但没有成功,如果您知道请给我链接。

【问题讨论】:

  • "class of TClassA" 告诉我你还有一些我们看不到的代码。你能在你实际调用它的地方显示你的代码吗?
  • 您发布的代码中没有“类转换”(或任何其他“转换”发生)。如果您在调用MyProcedure 时遇到问题,您应该发布调用MyProcedure 的代码
  • 展示一个完整的程序并显示错误说明是微不足道的。我们本可以立即给您一个明确的答案。相反,您省略了最重要的代码行。为什么?为什么要让我们为难?展示一个完整的程序,长 15 行,说明问题。
  • 您还没有编辑这个问题以包含我们需要看到的最关键的代码行才能帮助您。现在我别无选择,只能投反对票。

标签: delphi class types casting


【解决方案1】:

您的代码没有问题。鉴于您的类声明和程序,您可以这样做

var
  b: TBase;
  ca: TClassA;
  cb: TClassB;
begin
  MyProcedure(b);
  MyProcedure(ca);
  MyProcedure(cb);

它会编译得很好。显然,您所做 传递给MyProcedure 实际上不是TBaseTClassATClassB

【讨论】:

  • 取而代之的是class of TClassA
【解决方案2】:

我可以看到您收到该错误的唯一方法是您像这样调用MyProcedure()

MyProcedure(TClassA);

当你应该这样称呼它时:

var
  ca: TClassA;
...
MyProcedure(ca);

换句话说,它需要一个指向对象实例的指针,但是你传递给它的是一个类类型。

【讨论】:

  • 在 Delphi 2009 中,我收到的错误消息是 E2010 Incompatible types: 'TBase' and 'Class reference'。也许它在 Delphi 2010 中发生了变化。
  • 错误文本的内容并不重要。原因是一样的——过程期望一个对象指针作为输入,但是调用代码没有传入一个对象指针。
  • 我用你所说的对象调用 MyProcedure:ca: TClassA;我的程序(ca);但我得到了错误。使用 Delphi XE3。
  • @Martin 不,你没有。为什么你不能把你的整个程序都放在这个问题中?它可以减少到
猜你喜欢
  • 2021-03-02
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
相关资源
最近更新 更多