Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 为什么编译器会抱怨;“不兼容类型”;对于我的泛型函数参数?_Delphi_Generics_Parameter Passing_Delphi 2009 - Fatal编程技术网

Delphi 为什么编译器会抱怨;“不兼容类型”;对于我的泛型函数参数?

Delphi 为什么编译器会抱怨;“不兼容类型”;对于我的泛型函数参数?,delphi,generics,parameter-passing,delphi-2009,Delphi,Generics,Parameter Passing,Delphi 2009,我在泛型方面有问题。我不知道如何将OnCallbackWrapper传递给CallbackWrapper过程。我在以下示例中遇到“不兼容类型”错误: unit uTest; interface uses Generics.Defaults; type TGenericCallback<T> = procedure(Fields: T); type TSpecificFields = record A: Integer; B: Integer;

我在泛型方面有问题。我不知道如何将
OnCallbackWrapper
传递给
CallbackWrapper
过程。我在以下示例中遇到“不兼容类型”错误:

unit uTest;

interface

uses
  Generics.Defaults;

type
  TGenericCallback<T> = procedure(Fields: T);

type
  TSpecificFields = record
    A: Integer;
    B: Integer;
    C: Integer;
  end;

const
  SpecificFields: TSpecificFields =
  (A: 5; B: 4; C: 3);

procedure CallbackWrapper(GenericCallback: TGenericCallback<TSpecificFields>);

implementation

procedure CallbackWrapper(GenericCallback: TGenericCallback<TSpecificFields>);
begin
  GenericCallback(SpecificFields);
end;

procedure OnCallbackWrapper(const Fields: TSpecificFields);
begin
  Assert(Fields.A = 5);
  Assert(Fields.B = 4);
  Assert(Fields.C = 3);
end;

procedure Dummy;
begin
  CallbackWrapper(OnCallbackWrapper); //Incompatible types here
end;

end.
unitutest;
接口
使用
泛型。默认值;
类型
TGenericCallback=过程(字段:T);
类型
TSpecificFields=记录
A:整数;
B:整数;
C:整数;
结束;
常数
SpecificFields:tsSpecificFields=
(A:5;B:4;C:3);
过程CallbackWrapper(GenericCallback:TGenericCallback);
实施
过程CallbackWrapper(GenericCallback:TGenericCallback);
开始
GenericCallback(SpecificFields);
结束;
过程OnCallbackWrapper(常量字段:tsSpecificFields);
开始
断言(字段A=5);
断言(字段B=4);
断言(字段C=3);
结束;
程序假人;
开始
CallbackWrapper(OnCallbackWrapper)//这里的不兼容类型
结束;
结束。
我做错了什么?谢谢

procedure OnCallbackWrapper( Fields: TSpecificFields);
begin
  Assert(Fields.A = 5);
  Assert(Fields.B = 4);
  Assert(Fields.C = 3);
end;
或将声明更改为

  TGenericCallback<T> = procedure(const Fields: T);
TGenericCallback=procedure(常量字段:T);

按值传递参数的过程与按引用传递参数的过程不兼容

您声明的类型按值接收其参数

TGenericCallback<T> = procedure(Fields: T); // no const
因此,编译器拒绝您尝试传递的参数,因为它不匹配。你需要让双方都匹配。例如:

TGenericCallback<T> = procedure(const Fields: T);
TGenericCallback=procedure(常量字段:T);

你们太快了:)我知道我忽略了什么。这两个答案都很有帮助,所以对大卫来说+1,对布米来说是第一个答案。你应该接受最好的答案。如果你觉得有帮助的话,你也应该投票给bummi's。别害羞。但最重要的是,这不仅仅是谁跑得最快。请注意,我并不是说我的答案是你应该接受的。我已经说过很多次了。接受最好的答案。如果有人提出更好的答案。接受这个,谢谢你的评论。我在考虑你两个答案的质量。问题是,对我来说,bummi的代码足以理解我在哪里犯了错误。显然,这取决于你。我只是从表面上看“因为他是第一位的”。不管怎样,我很感激你有充分证据的回答,我注意到他的回答有点笨拙。这就是为什么我没有对它进行投票,而是将它标记为一个被接受的答案——因为它回答了我的问题,仅此而已。在那个特别的时刻,我需要一个快速的答案(我已经浪费了20分钟左右的时间试图理解为什么我的代码没有编译:),这正是我当时的想法。我希望这不会妨碍你在将来给出高质量的答案:)我真的很感激他们,我是认真的。如果这能解释为什么你需要做出这些改变,我会投这个票。顺便说一句,我明白用英语写解释对你来说可能不容易,但我更喜欢任何解释,不管英语有多差,而不是根本不解释。而且:你练习的越多,你得到的越好:-)除了我的英语问题,我觉得有很多事情需要详细解释。这是一个相当沉默寡言的人的个人问题。我会努力适应,但这不符合我的个性。我可以接受。如果你能,那就太好了。请注意,我真诚地希望不会有冗长的讨论。只是一些帮助人们理解你的答案的提示(非常准确)。以这个答案为例,没有解释会迫使人们寻找差异。你所做的编辑真的很有帮助!还有:不要害怕犯英语错误。这里有很多人愿意并且能够编辑你的答案,以提高英语水平。
TGenericCallback<T> = procedure(const Fields: T);