为什么编译器会为我的泛型函数参数抱怨"不兼容的类型"?

Wod*_*dzu 4 delphi generics parameter-passing delphi-2009

我在使用泛型方面遇到了问题.我不知道如何传递OnCallbackWrapperCallbackWrapper程序.我在以下示例中遇到"不兼容类型"错误:

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.
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?谢谢.

Dav*_*nan 8

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

TGenericCallback<T> = procedure(Fields: T); // no const
Run Code Online (Sandbox Code Playgroud)

您传递的功能标有const.

procedure OnCallbackWrapper(const Fields: TSpecificFields); // const parameter
Run Code Online (Sandbox Code Playgroud)

因此编译器拒绝您尝试传递的参数为不匹配.你需要让双方都匹配.例如:

TGenericCallback<T> = procedure(const Fields: T);
Run Code Online (Sandbox Code Playgroud)


bum*_*mmi 7

procedure OnCallbackWrapper( Fields: TSpecificFields);
begin
  Assert(Fields.A = 5);
  Assert(Fields.B = 4);
  Assert(Fields.C = 3);
end;
Run Code Online (Sandbox Code Playgroud)

或将声明改为

  TGenericCallback<T> = procedure(const Fields: T);
Run Code Online (Sandbox Code Playgroud)

按值传递参数的过程不与通过引用传递参数的过程分配兼容.参考