无法在 Spring4D 中将默认参数值与比较器一起使用

Can't use default parametr values with comparer in Spring4D

我不确定这是一般性问题还是因为 Spring4D 实现,但我不能使用默认参数值来创建比较器。

type
  TMyClass = class
    class function MyComparer(AParam: Boolean = False): IComparer<TMyClass>;
  end;

implementation

class function TMyClass.MyComparer(AParam: Boolean): IComparer<TMyClass>;
begin
  Result := TComparer<TMyClass>.Construct(
    function (const L, R: TMyClass): Integer
    begin
      Result := 0;
    end);
end;

当我创建一个没有指定参数的列表时,我收到一条关于缺少参数的错误消息。

TCollections.CreateSortedObjectList<TMyClass>(TMyClass.MyComparer);

E2035 Not enough actual parameters

然而,在没有任何参数或指定了所有参数的情况下,它仍然有效。我有什么理由不能这样做吗?

我没有 Spring4D 可以测试,但我猜测发生的事情类似于 this,其中 Delphi 的语法规则允许在执行时省略括号不带参数的方法会引入歧义。在这里,你在哪里:

 TCollections.CreateSortedObjectList<TMyClass>(TMyClass.MyComparer);

...编译器无法确定您是否打算直接传递方法 MyComparer(给采用方法指针类型 TComparison<T>CreateSortedObjectList 的重载)或者您是否打算执行该方法并传递 return 值。在这种情况下你想做后者,所以你可以对编译器明确并包含括号

 TCollections.CreateSortedObjectList<TMyClass>(TMyClass.MyComparer());