我希望在一个声明为procedure of object
的参数中传递一个空值。
考虑以下代码:
情况1
type
TFooProc = procedure(Foo1, Foo2 : Integer) of object;
procedure DoSomething(Param1:Integer;Foo:TFooProc);overload;
var
a, b : Integer;
begin
a:=b*Param1;
//If foo is assigned
if @Foo<>nil then
Foo(a, b);
end;
procedure DoSomething(Param1:Integer);overload;
begin
DoSomething(Param1,nil);//here the delphi compiler raise this message [DCC Error] E2250 There is no overloaded version of 'DoSomething' that can be called with these arguments
end;
案例2
我发现,如果我将TFooProc
声明为procedure
类型,则代码可以编译。(但在我的情况下,我需要一个procedure of object
类型)
type
TFooProc = procedure(Foo1, Foo2 : Integer);
procedure DoSomething(Param1:Integer;Foo:TFooProc);overload;
var
a, b : Integer;
begin
a:=b*Param1;
//If foo is assigned
if @Foo<>nil then
Foo(a, b);
end;
procedure DoSomething(Param1:Integer);overload;
begin
DoSomething(Param1,nil);
end;
案例三
我还发现,如果删除overload
指令,则代码可以编译成功。
type
TFooProc = procedure(Foo1, Foo2 : Integer) of object;
procedure DoSomething(Param1:Integer;Foo:TFooProc);
var
a, b : Integer;
begin
a:=b*Param1;
//If foo is assigned
if @Foo<>nil then
Foo(a, b);
end;
procedure DoSomething2(Param1:Integer);
begin
DoSomething(Param1,nil);
end;
问题是如何将空值作为参数传递?以便在第一种情况下使用代码?请参考以下内容:
如何将nil值作为参数传递?
以使得在第一种情况下可以使用该代码?
@foo <> nil
?简单的Assigned(Foo)
可以避免否定,并且通常建议使用Assigned
来检查指针和方法引用。 - Marjan Venema