为什么我得到 E2531 "Method requires explicit type argument"
Why am I getting E2531 "Method requires explicit type argument"
下面的代码在很大程度上依赖于泛型,我认为在泛型处理中暴露了一个错误。但也许只是有些事情我不明白。
编译器报错:
E2531 方法 'CreateBaseItem' 需要显式类型参数
上线:
foo3 := TFactory.CreateBaseItem<TDescendentFunctionsGroup2.Select>;
但据我所知,从 foo1
到 foo4
的实例化在本质上应该是相同的。这个完整的程序突出了这个问题:
program SO53568763;
type
TBaseItem = class(TInterfacedObject);
IListableItem<T> = interface
['{6FD07ACB-04BB-4BFC-A38C-9B98F86DBC25}']
end;
TSomeDescendent = class(TBaseItem, IListableItem<TSomeDescendent>)
end;
TSelectFunctionsGenerator<T: TBaseItem, IListableItem<T>> = class(TBaseItem)
end;
TFunctionsGroup<T: TBaseItem, IListableItem<T>> = class
public
type
Select = TSelectFunctionsGenerator<T>;
end;
TDescendentFunctionsGroup1 = class(TFunctionsGroup<TSomeDescendent>);
TDescendentFunctionsGroup2 = TFunctionsGroup<TSomeDescendent>;
TFactory = class
public
class function CreateBaseItem<T: TBaseItem>: T;
end;
class function TFactory.CreateBaseItem<T>;
begin
end;
procedure Foo;
var
foo: TSelectFunctionsGenerator<TSomeDescendent>;
foo1: TFunctionsGroup<TSomeDescendent>.Select;
foo2: TDescendentFunctionsGroup1.Select;
foo3: TDescendentFunctionsGroup2.Select;
begin
foo := TFactory.CreateBaseItem<TSelectFunctionsGenerator<TSomeDescendent>>;
foo1 := TFactory.CreateBaseItem<TFunctionsGroup<TSomeDescendent>.Select>;
foo2 := TFactory.CreateBaseItem<TDescendentFunctionsGroup1.Select>;
foo3 := TFactory.CreateBaseItem<TDescendentFunctionsGroup2.Select>;
end;
begin
end.
奇怪的是 TDescendentFunctionsGroup2.Select
足够明确地声明该类型的变量,但不够明确地用作 CreateBaseItem
.
的通用参数
这似乎是一个编译器错误。 TDescendentFunctionsGroup1
和TDescendentFunctionsGroup2
的区别是前者是从TFunctionsGroup<TSomeDescendent>
派生出来的新的class,后者是TFunctionsGroup<TSomeDescendent>
.[=15=的别名。 ]
所以我的猜测是解析器或编译器在泛型类型的别名方面存在问题。
无论如何,我真的不确定别名会给你带来什么好处,所以我只是这样写:
var
foo3: TFunctionsGroup<TSomeDescendent>.Select;
...
foo3 := TFactory.CreateBaseItem<TFunctionsGroup<TSomeDescendent>.Select>;
下面的代码在很大程度上依赖于泛型,我认为在泛型处理中暴露了一个错误。但也许只是有些事情我不明白。
编译器报错:
E2531 方法 'CreateBaseItem' 需要显式类型参数
上线:
foo3 := TFactory.CreateBaseItem<TDescendentFunctionsGroup2.Select>;
但据我所知,从 foo1
到 foo4
的实例化在本质上应该是相同的。这个完整的程序突出了这个问题:
program SO53568763;
type
TBaseItem = class(TInterfacedObject);
IListableItem<T> = interface
['{6FD07ACB-04BB-4BFC-A38C-9B98F86DBC25}']
end;
TSomeDescendent = class(TBaseItem, IListableItem<TSomeDescendent>)
end;
TSelectFunctionsGenerator<T: TBaseItem, IListableItem<T>> = class(TBaseItem)
end;
TFunctionsGroup<T: TBaseItem, IListableItem<T>> = class
public
type
Select = TSelectFunctionsGenerator<T>;
end;
TDescendentFunctionsGroup1 = class(TFunctionsGroup<TSomeDescendent>);
TDescendentFunctionsGroup2 = TFunctionsGroup<TSomeDescendent>;
TFactory = class
public
class function CreateBaseItem<T: TBaseItem>: T;
end;
class function TFactory.CreateBaseItem<T>;
begin
end;
procedure Foo;
var
foo: TSelectFunctionsGenerator<TSomeDescendent>;
foo1: TFunctionsGroup<TSomeDescendent>.Select;
foo2: TDescendentFunctionsGroup1.Select;
foo3: TDescendentFunctionsGroup2.Select;
begin
foo := TFactory.CreateBaseItem<TSelectFunctionsGenerator<TSomeDescendent>>;
foo1 := TFactory.CreateBaseItem<TFunctionsGroup<TSomeDescendent>.Select>;
foo2 := TFactory.CreateBaseItem<TDescendentFunctionsGroup1.Select>;
foo3 := TFactory.CreateBaseItem<TDescendentFunctionsGroup2.Select>;
end;
begin
end.
奇怪的是 TDescendentFunctionsGroup2.Select
足够明确地声明该类型的变量,但不够明确地用作 CreateBaseItem
.
这似乎是一个编译器错误。 TDescendentFunctionsGroup1
和TDescendentFunctionsGroup2
的区别是前者是从TFunctionsGroup<TSomeDescendent>
派生出来的新的class,后者是TFunctionsGroup<TSomeDescendent>
.[=15=的别名。 ]
所以我的猜测是解析器或编译器在泛型类型的别名方面存在问题。
无论如何,我真的不确定别名会给你带来什么好处,所以我只是这样写:
var
foo3: TFunctionsGroup<TSomeDescendent>.Select;
...
foo3 := TFactory.CreateBaseItem<TFunctionsGroup<TSomeDescendent>.Select>;