gpt4 book ai didi

Delphi:OleVariant 和泛型

转载 作者:行者123 更新时间:2023-12-03 14:52:42 28 4
gpt4 key购买 nike

考虑以下代码摘录:

type
MyIntf = interface
procedure Work(param: OleVariant);
end;

MyClass<T> = class
procedure MyWork(param: T);
end;

var
intf: MyIntf;

procedure MyClass<T>.MyWork(param: T);
begin
//compiler error: E2010 Incompatible types: 'OleVariant' and 'T'
intf.Work(param);
end;

编译失败,并出现上述错误消息。我如何从我的泛型类中调用 Work 函数?

最佳答案

您的代码无法编译,因为编译器无法保证在编译泛型类时可能会转换为所有可想象的 T

当面对

intf.Work(param);

在泛型方法中,编译器需要知道如何将 param 转换为 OleVariant。但它不能这样做。与模板相比,这是泛型的局限性之一。

<小时/>

最简单的解决方案是在运行时借助 Rtti 单元的 TValue 进行转换。

procedure MyClass<T>.MyWork(param: T);
begin
intf.Work(TValue.From<T>(param).AsVariant);
end;

下面是一个示例测试程序,用于演示 TValue 可以完成这项工作:

program SO15113162;
{$APPTYPE CONSOLE}

uses
Rtti;

procedure Work(param: OleVariant);
begin
Writeln(param);
end;

type
MyClass<T> = class
class procedure MyWork(param: T);
end;

class procedure MyClass<T>.MyWork(param: T);
begin
Work(TValue.From<T>(param).AsVariant);
end;

begin
MyClass<Double>.MyWork(2.4);
MyClass<string>.MyWork('hello');
MyClass<Integer>.MyWork(-666);
Readln;
end.

输出

2.4hello-666

关于Delphi:OleVariant 和泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15113162/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com