В зависимости от фактического типа 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;
Понятно, что я не могу присвоить Result
ничего, кроме T
, а 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;
TryGet<T: class>
, вы можете сделатьMyObject as T
в Delphi XE и новее. Затем вы также можете выполнитьT(MyObject)
в Delphi 2010 и новее. - person gabr   schedule 11.05.2018Result:= FMyObject
? Я не записал всю справочную информацию, потому что мой вопрос был именно об этом. Я не могу изменить концепцию своей структуры классов из 2000+ строк. И если вы не заметили: у меня уже есть свое решение — я записал его, чтобы помочь другим после того, как не смог найти существующее решение здесь, в stackoverflow. - person maf-soft   schedule 11.05.2018