【发布时间】:2013-05-23 13:41:25
【问题描述】:
当我省略构造函数的可选参数时,有人可以解释为什么我在以下程序中出现“不兼容类型”错误(Delphi XE3)(详情请参阅代码底部的 cmets)?
program Test;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
System.Classes;
type
BaseClass = class(TObject);
ChildClass = class(BaseClass);
GenericBaseClass<T> = class
public
constructor Create(Fixed: Integer);
end;
GenericClass<T: BaseClass> = class(GenericBaseClass<T>)
public
type
TMyProc = procedure (DataObject: T) of object;
public
constructor Create(Fixed: String; Optional: TMyProc = nil);
end;
constructor GenericClass<T>.Create(Fixed: String; Optional: TMyProc);
begin
inherited Create(12);
end;
constructor GenericBaseClass<T>.Create(Fixed: Integer);
begin
inherited Create();
end;
var
Gc: GenericClass<ChildClass>;
begin
// this call is okay
Gc := GenericClass<ChildClass>.Create('', nil);
// this call fails: E2010 Incompatible types: 'ChildClass' and 'T'
Gc := GenericClass<ChildClass>.Create('');
end.
【问题讨论】:
-
错误信息提示我泛型类型的实例化不适用于默认参数,
GenericClass<ChildClass>的默认参数仍然是GenericClass<T>.TMyProc类型的常量nil,而不是GenericClass<ChildClass>.TMyProc类型的预期常量nil。你能通过测试非依赖类型的默认参数是否有效来检查吗? -
非依赖类型似乎有效(例如,当我将
Optional参数的类型从TMyProc更改为Pointer时,它有效)您的解释听起来很合理,谢谢。
标签: delphi generics optional-parameters type-constraints