Wod*_*dzu 4 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;
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)
我究竟做错了什么?谢谢.
您声明的类型按值接收其参数.
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)
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)
按值传递参数的过程不与通过引用传递参数的过程分配兼容.参考
| 归档时间: |
|
| 查看次数: |
660 次 |
| 最近记录: |