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

Delphi 这个不兼容类型错误有什么问题,delphi,Delphi,我过了几天有人问我为什么这个代码会出错。我想弄明白,但我想不通,所以我希望你们能帮助我们 第一个单位:定义类别的地方 第一单元 interface type TSomeGeneric<T> = class private function getSelf: TSomeGeneric<T>; public property This : TSomeGeneric<T> read getSelf; end; implementa

我过了几天有人问我为什么这个代码会出错。我想弄明白,但我想不通,所以我希望你们能帮助我们

第一个单位:定义类别的地方 第一单元

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.
接口
类型
TSomeGeneric=class
私有的
函数getSelf:TSomeGeneric;
公众的
属性:TSomeGeneric read getSelf;
结束;
实施
{TSomeGeneric}
函数TSomeGeneric.getSelf:TSomeGeneric;
开始
结果:=自我;
结束;
结束。
单元2:它对单元1中定义的类进行引用 第二单元

interface

uses
  Unit1;

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

implementation

end.
接口
使用
单元1;
类型
TSomeGeneric=class(Unit1.TSomeGeneric);
实施
结束。
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.
接口
使用
窗口、消息、系统工具、变体、类、图形、控件、窗体、对话框、,
单元2;
类型
TfrmMain=类(TForm)
过程表单创建(发送方:ToObject);
私有的
{私有声明}
程序SomeProcedure(ASG:TSomeGeneric);
公众的
{公开声明}
结束;
变量
frmMain:TfrmMain;
实施
{$R*.dfm}
{TfrmMain}
过程TfrmMain.FormCreate(发送方:TObject);
var ASG:TSomeGeneric;
开始
ASG:=TSomeGeneric.Create();
与ASG do
尝试
//使用操作系统类。。。
某些程序(本)//错误->不兼容类型
最后
自由();
结束;
结束;
程序TfrmMain.SomeProcedure(ASG:TSomeGeneric);
开始
//...
结束;
结束。

我怀疑在这一点上TSomeGeneric=class(Unit1.TSomeGeneric)TSomeGeneric被定义为另一个类而不是引用,但我不能确认编译器是否已经非常清楚了。有问题的一行是:

  SomeProcedure(This);
错误是:

[dcc32 Error] E2010 Incompatible types: 'Unit2.TSomeGeneric' and 'Unit1.TSomeGeneric' 定义一个新类型,现在有两个不兼容的类型


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

编译器非常清楚地说明了这一点。有问题的一行是:

  SomeProcedure(This);
错误是:

[dcc32 Error] E2010 Incompatible types: 'Unit2.TSomeGeneric' and 'Unit1.TSomeGeneric' 定义一个新类型,现在有两个不兼容的类型


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

是的,它肯定是另一个类——同名的Unit1类的后代。如果你怀疑这就是问题所在,为什么你不能证实呢?只需删除Unit2,改用Unit1,看看程序是否编译并工作。如果调用
SomeProcedure(ASG)
而不是
SomeProcedure(This)
,它是否有效?是的,它在使用SomeProcedure(ASG)时有效,但在传递属性ASG时无效。那正是我迷路的地方,因为ASG。这实际上是另一门课?过程param中所需的Unit.TSomeGeneric而不是Unit2.TSomeGeneric?是的,它肯定是另一个类-具有相同名称的Unit1类的后代。如果你怀疑这就是问题所在,为什么你不能证实呢?只需删除Unit2,改用Unit1,看看程序是否编译并工作。如果调用
SomeProcedure(ASG)
而不是
SomeProcedure(This)
,它是否有效?是的,它在使用SomeProcedure(ASG)时有效,但在传递属性ASG时无效。那正是我迷路的地方,因为ASG。这实际上是另一门课?过程参数中需要的Unit.TSomeGeneric而不是Unit2.TSomeGeneric?好的,谢谢,还有一个问题,在Unit2中,有一种方法可以从unit1链接这个类而不重新定义它自己?好像不是泛型类。TSomeSimpleType=Unit1.TSomeSimpleType.Nope,您不能声明泛型类型别名OK谢谢,还有一个问题,在unit2中有一种方法可以从Unit1链接这个类而不重新定义自己?好像不是泛型类。例如:TSomeSimpleType=Unit1.TSomeSimpleType.Nope,不能声明泛型类型别名