Delphi 11 中的 Variant 行为是否发生了变化?

use*_*073 3 delphi variant

在Delphi 10.3中,我编写了一些Excel自动化代码。我使用了变体。当例程完成后,我清除并释放了 AndNil 变体......

  VarClear(arrData);
  FreeAndNil(arrData);
Run Code Online (Sandbox Code Playgroud)

这编译并运行良好。我刚刚升级到D11,即亚历山大。这段代码现在给出了一个错误。...不兼容的类型:TObject 和 Variant。

我将这部分代码重写为:

  VarClear(arrData);
  arrData.Free;
Run Code Online (Sandbox Code Playgroud)

这个编译,乍一看,似乎运行良好。这是清除/处置亚历山大变体的正确方法吗?

Rem*_*eau 15

FreeAndNil()确切地说,在 Delphi 10.4 中,的签名确实发生了变化:

https://blog.marcocantu.com/blog/2020-may-delphi-104-rtl.html

我们更新了 FreeAndNil 过程的签名,以避免其与接口引用和其他不支持的数据类型一起使用。现在声明需要对 TObject 的引用:

procedure FreeAndNil(const [ref] Obj: TObject); inline;

这意味着 FreeAndNil 的错误使用现在将导致编译器错误。过去,错误的使用不会被捕获,从而导致困难的错误。请注意,虽然参数被声明为 const,但引用变量确实被修改了。

一开始就尝试Free()这样做是错误的。Variant从来没有起作用,而且一开始就不应该出现在你的代码中。根据旧的定义,FreeAndNil()会调用TObject.Free()Variant这是错误的。在您的新代码下,将进行编译,但会在运行时调用方法分派来调用Excel 对象上arrData.Free;不存在的方法,这将失败。Free()

因此,只需将其Free完全删除即可,它不属于这里。在所有 Delphi 版本中,手动将 a 重置为默认状态的正确解决方案Variant是分配Variants.NullVariants.Unassigned给它,例如:

arrData := Null;
Run Code Online (Sandbox Code Playgroud)
arrData := Unassigned;
Run Code Online (Sandbox Code Playgroud)


Dav*_*nan 6

这两个代码片段都是错误的。你不调用Free变体。您Free调用一个对象实例。只需删除该行即可。

  • 在您告诉我该代码曾经有效之前,它不起作用。它一直都是错的,而你却以某种方式逃脱了惩罚。 (2认同)