私はイニシャライザを実装する制約のないジェネリック型のAtomicを持っています(詳細はprevious question)。制約のないジェネリック型に基づくオブジェクトインスタンスの作成
type
Atomic<T> = class
type TFactory = reference to function: T;
class function Initialize(var storage: T; factory: TFactory): T;
end;
は、今私は(typeof演算(T)がtkClassであることを提供する)Tから型情報を取る簡素化初期化関数を記述し、デフォルトのコンストラクタを使用して新しいインスタンス(必要なとき)を作成します。
悲しいことに、これは失敗します。
class function Atomic<T>.Initialize(var storage: T): T;
begin
if not assigned(PPointer(@storage)^) then begin
if PTypeInfo(TypeInfo(T))^.Kind <> tkClass then
raise Exception.Create('Atomic<T>.Initialize: Unsupported type');
Result := Atomic<T>.Initialize(storage,
function: T
begin
Result := TClass(T).Create; // <-- E2571
end);
end;
end;
コンパイラがエラーE2571 Type parameter 'T' doesn't have class or interface constraint
を報告します。
コンパイラをトリックしてクラスTのインスタンスを作成するにはどうすればよいですか?
ありがとうございます。しかし、XE2 Update 2の問題の中核は、Tが 'class'制約でマークされていないとTypeInfo(T)がコンパイルされないことです。 – gabr
これは分かりませんでした。これは "機能"かバグですか? – Linas
私は確信していませんが、私はそれが機能だと恐れています。 – gabr