gpt4 book ai didi

delphi - 如何将重载类方法分配给匿名方法?

转载 作者:行者123 更新时间:2023-12-03 14:37:04 25 4
gpt4 key购买 nike

在Delphi中,我们可以将类方法(声明为对象的过程)指定为匿名方法类型的参数。

对于重载方法(相同方法名),传递对象方法失败并出现编译错误:

[dcc32 Error] Project56.dpr(40): E2010 Incompatible types: 'System.SysUtils.TProc<System.Integer,System.Integer>' and 'Procedure of object'

下面的例子展示了这种情况。是否可以让重载方法作为匿名方法参数传递?

type
TTest = class
public
procedure M(a: Integer); overload;
procedure M(a, b: Integer); overload;
end;

procedure TTest.M(a, b: Integer);
begin
WriteLn(a, b);
end;

procedure TTest.M(a: Integer);
begin
WriteLn(a);
end;

procedure DoTask1(Proc: TProc<Integer>);
begin
Proc(100);
end;

procedure DoTask2(Proc: TProc<Integer,Integer>);
begin
Proc(100, 200);
end;

begin
var o := TTest.Create;
DoTask1(o.M); // <-- Success
DoTask2(o.M); // <-- Fail to compile: E2010 Incompatible types: 'System.SysUtils.TProc<System.Integer,System.Integer>' and 'Procedure of object'
ReadLn;
end.

最佳答案

当你写

DoTask2(o.M);

编译器发现 o.M 不是匿名方法,并在幕后为您生成一个匿名方法,包装对 o.M 的调用。不幸的是,执行此操作时它无法搜索重载方法,因此会出现编译错误。

解决方案是手动生成匿名方法包装器。

DoTask2(
procedure(a, b: Integer)
begin
o.M(a, b);
end
);

这正是编译器在用匿名方法包装标准方法时在幕后为您所做的事情。因此,虽然语法很烦人,但运行时的最终结果是相同的。

关于delphi - 如何将重载类方法分配给匿名方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57685791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com