私見その制約の公式の理由は、コンパイラが実際にそれを自分で処理できないことです。
これは、コンストラクター制約が必要であるという事実をコンパイラーが認識しているため、自分で設定することもできるコンパイラーの単なるフラグです。Generic クラスはそのクラスを使用する前にコンパイルされるため、コンパイラによって自動的に処理される可能性があります。
たぶん、XE9でそれを取得します
アップデート
TComponent が public パラメータのないコンストラクタなしでクラス型として受け入れられる場合、コンストラクタの制約は役に立ちません。これは、この (Nick からの拡張サンプル) が TComponent インスタンスをコンパイルして生成するためです。もちろん、元のコンストラクタ TComponent.Create( AOwner : TComponent ) は呼び出されず、代わりに TObject.Create が呼び出されますが、TComponent インスタンスがあります。
program Project3;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils, System.Classes;
type
TSomeClass<T: class, constructor> = class
function GetType: T;
end;
{ TSomeClass<T> }
function TSomeClass<T>.GetType: T;
begin
Result := T.Create;
end;
var
SomeClass : TSomeClass<TComponent>;
Component : TComponent;
begin
try
SomeClass := TSomeClass<TComponent>.Create;
Component := SomeClass.GetType;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
アップデート
TSomeClass<T: class, constructor>
と同じ意味です
TSomeClass<T: constructor>
レコードにはコンストラクターを含めることができますが、パラメーターなしのレコードを含めることはできないため、クラスに対する暗黙の制約があります。そしてこれをひっくり返す
TSomeClass<T: class>
暗黙のコンストラクター制約を持つことができます