2

我不确定这是否是一些一般性问题,或者是因为 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 实际参数不足

但是,如果没有任何参数或指定所有参数,它就可以工作。有什么理由我不能这样做吗?

4

1 回答 1

4

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

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

...编译器无法确定您是要MyComparer直接传递方法(其重载CreateSortedObjectList采用方法指针类型TComparison<T>)还是要执行方法并传递返回值。在这种情况下,您想要执行后者,因此您可以明确编译器并包含括号

 TCollections.CreateSortedObjectList<TMyClass>(TMyClass.MyComparer());
于 2018-10-10T17:37:32.503 回答