【发布时间】:2017-08-02 09:09:39
【问题描述】:
我有一个 DUnitX 测试套件在 Win32 上运行良好。但是当我尝试为 Win64 编译它时,这一行会产生编译错误:
Assert.AreEqual(4, Length(r.Values));
[dcc64 错误] ...:E2532 无法从方法“AreEqual”的不同参数类型推断泛型类型参数
r.Values 定义为:
Type TIntegers = TArray<Integer>
Assert.AreEqual 有不同的重载实现,而 dcc64 无法选择正确的实现……好吧,但是为什么呢?为什么 dcc32 可以毫无问题地编译它?
我唯一的线索是,如果我用鼠标悬停,Delphi 会告诉我 Length 是 System.Smallint 类型。没有带有 Smallint 参数的 Assert.AreEqual 实现......果然,如果我将它转换为 Integer,dcc64 将编译它。
但这让我很烦恼。如果我查看 System.pas 单元,我可以看到 DynArraySetLength 采用 NativeInt 参数......一个 64 位整数(我希望是无符号的,但不确定)。那么为什么 Length 应该返回一个 16 位有符号整数呢?这似乎是等待发生的麻烦,对吧?
我错过了什么?
【问题讨论】: