4

ジェネリックに問題があります。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.

私は何が間違っているのですか?ありがとう。

4

2 に答える 2

8

宣言した型は、値ごとにパラメーターを受け取ります。

TGenericCallback<T> = procedure(Fields: T); // no const

渡す関数は。でマークされていconstます。

procedure OnCallbackWrapper(const Fields: TSpecificFields); // const parameter

そのため、コンパイラーは、渡そうとしたパラメーターを一致しないものとして拒否します。両側を一致させる必要があります。例えば:

TGenericCallback<T> = procedure(const Fields: T);
于 2012-12-20T14:36:22.513 に答える
7
procedure OnCallbackWrapper( Fields: TSpecificFields);
begin
  Assert(Fields.A = 5);
  Assert(Fields.B = 4);
  Assert(Fields.C = 3);
end;

または宣言をに変更します

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

パラメータを値で渡すプロシージャは、パラメータを参照で渡すプロシージャとの代入互換性がありません。参照

于 2012-12-20T14:36:00.847 に答える