将ToString用于变量

问题描述 投票:1回答:1

以下代码产生EVariantInvalidOpError异常:

var
  i : Variant;
begin
  i := 10;
  ShowMessage(i.ToString());
end;

Picture displaying the "Invalid variant operation" exception dialog

以下所有方法都很好,但我不明白为什么ToString函数会引发Variant类型变量的异常:

var
  i : Variant;
begin
  i := 10;
  ShowMessage(VarToStr(i));
end;

var
  i : Integer;
begin
  i := 10;
  ShowMessage(i.ToString());
end;
delphi tostring delphi-xe7 variant
1个回答
0
投票

变量使您可以在其中存储各种类型的值,而在编译时该类型可能是未知的。您可以将整数值写入Variant类型的单个变量,然后用字符串值覆盖它。除值变量记录外,type information也存储在其中。在这些值中,其中一些是自动分配和/或引用计数的。从Variant变量写入或读取值时,编译器在后台做了很多工作。

varDispatch类型的变量从编译器中获得更多特殊待遇。 varDispatch表示该值的类型为IDispatch(通常,但不一定与Windows IDispatch相关)。 COM technology的实例通过IDispatchGetTypeInfoCount方法提供有关其方法和属性的信息。您可以使用其GetTypeInfo方法按名称查询信息。

让我们先从您的评论中回答问题:

即使没有帮助者为GetIDsOfNames类型实现该功能,Delphi为什么允许我使用ToString函数?

这就是Delphi如何实现称为Variant的概念。它允许您调用在编译时类型未知的对象的方法。此项工作的前提是基础变体类型支持后期绑定。 Delphi具有对late bindingvarDispatch变体的后期绑定的内置支持,如在程序varUnknown中的单元DispInvokeCore中所见。

我不明白为什么System.Variants函数会引发ToString类型变量的异常。

如上所述,在运行时,您的程序尝试对变量值为Variant的变量值调用ToString方法。由于它不支持后期绑定(以及其他序数变体类型),因此会出现异常。

要将变量值转换为字符串,请使用varByte

© www.soinside.com 2019 - 2024. All rights reserved.