В зависимости от фактического типа T, я хочу вернуть конкретное значение; вот упрощенный пример (обертка записи вокруг некоторого объекта):
function TMyRec.TryGet<T>(const Default: T): T;
begin
if TypeInfo(T) = TypeInfo(TMyObject) then
Result:= FMyObject {E2010 Incompatible types}
else Result:= FMyObject.TryGet<T>(Default);
end;
Понятно, что я не могу назначить ничего, кроме T
для Result
, и as T
или T()
не работают, когда T
не ограничен class
...
Также невозможно выполнить перегрузку, которая отличается только общим ограничением:
function TryGet<T: TMyObject>(const Default: T): T; overload;
{...}
Result:= FMyObject as T; {here it would work}
Чтобы помочь понять обсуждение в комментариях ниже, вот пример из моего редактирования:
function TMyRec.TryGet<T>(const Default: T): T;
begin
if TypeInfo(T) = TypeInfo(TMyObject) then Result:= FMyObject
//else ...
else Result:= Default;
end;