5

これらのオーバーロードを受け取る2つの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);

調べたところ、2番目のオーバーロードが呼び出されたという結果が得られました。なんで?どちらも呼び出されるのが有効だからです。

4

2 に答える 2

7
Form1.GetMagicNumber

あいまいです。関数、または関数の実行後に返される値のいずれかです。ほとんどのコンテキストでは、これらの意味の1つだけが有効であり、その意味が選択されます。

コードでは、どちらの意味も有効です。このようなシナリオでは、言語規則は、手続き型の解釈が選択されることを意味します。

関数の呼び出しを強制するには、次のように記述します。

Form1.GetMagicNumber()

これは、C、C ++、C#、Java、Pythonなど、他のほとんどの言語との大きな違いです。これらの言語では、関数を呼び出すために括弧を使用する必要があります。

于 2012-12-28T09:57:53.457 に答える
1

これは、最初のEqual関数が2番目のEqual関数と同じ型パラメーターを持っているためです。

実行するときは$ ( TVariantExpression = reference to function(): Variant; )TVariantExpressionVariantタイプを値として取得します。

于 2012-12-28T09:59:04.097 に答える