【发布时间】:2018-05-11 12:19:51
【问题描述】:
根据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}
为了帮助理解下面 cmets 中的讨论,以下是我编辑之前的示例:
function TMyRec.TryGet<T>(const Default: T): T;
begin
if TypeInfo(T) = TypeInfo(TMyObject) then Result:= FMyObject
//else ...
else Result:= Default;
end;
【问题讨论】:
-
如果 T 标记为
TryGet<T: class>类,那么您可以在 Delphi XE 和更新版本中执行MyObject as T。然后,您还可以在 Delphi 2010 及更高版本中执行T(MyObject)。 -
最简单的方法是您在答案中使用的方法,恕我直言。
-
我只是refer to Eric Lippert here,但您可能会认为在这种情况下通用解决方案可能是错误的解决方案。
-
@maf-soft 我无法给您写答案,因为我不知道您实际上要解决什么问题。我只能说,鉴于您尝试解决它的方式,泛型可能不是正确的解决方案。
-
这对我来说似乎没有多大意义。如果您知道类型是什么,为什么要使用泛型。我很困惑,我想你也是。
标签: delphi generics casting type-conversion delphi-10.2-tokyo