以下代码应该可以编译,并且可以与许多其他类型一起编译。
但是,编译器报告“常量对象不能作为 var 参数传递”错误——尽管变量很明显是一个变量。
program CurrencyConstant;
{$APPTYPE CONSOLE}
var
GVar: Currency;
begin
FillChar(GVar, SizeOf(GVar), 0);
end.
同样,过程中的局部变量也会出现同样的问题。
procedure TestCurrency;
var
LVar: Currency;
begin
FillChar(LVar, SizeOf(LVar), 0);
end;
我怀疑这与FillChar
编译器魔术过程有关,这Dest
是一个无类型的var参数。 FillChar
是我发现这个问题的唯一例程。
- 是什么导致了这个问题?
- 其他类型是否受到影响?
作为对不可避免的“你为什么要那样做评论”的回应:我们有一个代码生成器,它使用 FillChar 来一般地初始化记录结构和原始类型。它适用于其他一切,但意外地与货币失败。我们确实有解决方法,但最好了解根本原因,并了解是否有其他任何事情可能给我们带来麻烦。
编辑
从Jeroen 的回答可以合理地得出结论,该问题存在于所有版本的 Delphi 中。此外,货币数组显然表现出类似的问题。
大卫的回答提供了一些不错的解决方法。
最后一个要考虑的解决方法是,修改生成器以将货币作为特殊情况处理,并简单地设置Value := 0
.