这个不兼容的类型错误有什么问题

时间:2013-06-14 18:53:24

标签: delphi

几天,有人问我为什么这段代码会出错。我想弄清楚,但我不能,所以我希望你们帮助我们。

第一单元:定义了classe     单位Unit1;

interface

type
  TSomeGeneric<T> = class
  private
    function getSelf: TSomeGeneric<T>;
  public
    property This : TSomeGeneric<T> read getSelf;
  end;

implementation

{ TSomeGeneric<T> }

function TSomeGeneric<T>.getSelf: TSomeGeneric<T>;
begin
  Result := Self;
end;

end.

单元2:它对单元1中定义的classe进行引用     单位Unit2;

interface

uses
  Unit1;

type
  TSomeGeneric<T> = class(Unit1.TSomeGeneric<T>);

implementation

end.

frmmain:它使用unit2是一点     单位ufrmMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,

  Unit2;

type
  TfrmMain = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure SomeProcedure(ASG : TSomeGeneric<Integer>);
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

{ TfrmMain }

procedure TfrmMain.FormCreate(Sender: TObject);
var ASG : TSomeGeneric<Integer>;
begin
  ASG := TSomeGeneric<Integer>.Create();
  with ASG do
    try
      //make use os the class ...
      SomeProcedure(This); //error -> incompatible types
    finally
      Free();
    end;
end;

procedure TfrmMain.SomeProcedure(ASG: TSomeGeneric<Integer>);
begin
  //...
end;

end.

我怀疑在这一点TSomeGeneric = class(Unit1.TSomeGeneric)TSomeGeneric被定义为另一个classe而不是引用,但我无法确认

1 个答案:

答案 0 :(得分:4)

编译器非常清楚。有问题的一行就是这个:

  SomeProcedure(This);

错误是:

[dcc32 Error] E2010 Incompatible types: 'Unit2.TSomeGeneric' and 
'Unit1.TSomeGeneric'

那是因为在那个方法中调用:

  • This的类型为Unit1.TSomeGeneric<System.Integer>
  • SomeProcedure需要Unit2.TSomeGeneric<System.Integer>类型的参数。

这些不是同一类型,因为你明确地将它们区别开来。

type
  TSomeGeneric<T> = class(Unit1.TSomeGeneric<T>);

定义了一种新类型,现在你有两种不兼容的类型。

您只需删除Unit2即可。除了停止合理的代码编译之外,它没有用处。