Может кто-нибудь объяснить, почему я получаю сообщение об ошибке «Несовместимый тип» (Delphi XE3) в следующей программе (подробности см. в комментариях внизу кода), когда я опускаю необязательный параметр для конструктора?
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>
остается константойnil
типаGenericClass<T>.TMyProc
, а не предполагаемой константойnil
типаGenericClass<ChildClass>.TMyProc
. Можете ли вы проверить это, проверив, работают ли аргументы по умолчанию независимых типов? - person   schedule 28.05.2013Optional
сTMyProc
наPointer
, он работает), ваше объяснение звучит разумно, спасибо. - person TmTron   schedule 29.05.2013