5

我有两个 Equal 方法可以接受这些重载:

TVariantExpression = reference to function(): Variant;

function Equal(const value: Variant): TRuleBuilder; overload;
function Equal(expr: TVariantExpression): TRuleBuilder; overload;

假设我有另一个功能:

function TForm1.GetMagicNumber: Variant;
begin
  Result := 10;
end;

我调用这样的函数:

Equal(Form1.GetMagicNumber);

检查后,我得到调用第二个重载的结果。为什么?因为它们都可以被调用。

4

2 回答 2

7
Form1.GetMagicNumber

是模棱两可的。它可以是函数,也可以是函数执行后返回的值。在大多数情况下,这些含义中只有一个是有效的,并且选择了该含义。

在您的代码中,任何一种含义都是有效的。在这种情况下,语言规则意味着选择程序类型解释。

要强制函数调用,请编写:

Form1.GetMagicNumber()

这是与大多数其他语言的显着区别,例如 C、C++、C#、Java、Python 等。在这些语言中,您必须使用括号才能调用函数。

于 2012-12-28T09:57:53.457 回答
1

这是因为第一个 Equal Function 具有与第二个 Equal 函数相同的类型参数!

当您这样做时$ ( TVariantExpression = reference to function(): Variant; )TVariantExpression将 Variant 类型作为值。

于 2012-12-28T09:59:04.097 回答