Fra*_*azz 4 delphi delphi-10.1-berlin
我有一个在Win32上正常运行的DUnitX测试套件.但是当我尝试为Win64编译它时,这一行会产生编译错误:
Assert.AreEqual(4, Length(r.Values));
Run Code Online (Sandbox Code Playgroud)
[dcc64错误] ...:E2532无法从方法'AreEqual'的不同参数类型推断泛型类型参数
r.Values定义为:
Type TIntegers = TArray<Integer>
Run Code Online (Sandbox Code Playgroud)
Assert.AreEqual有不同的重载实现,dcc64无法选择正确的...好的,但为什么呢?为什么dcc32可以没有问题地编译它?
我唯一的线索是,如果我用鼠标悬停,Delphi会告诉我Length是System.Smallint类型.使用Smallint参数没有Assert.AreEqual实现......果然,如果我将它转换为Integer,dcc64将编译它.
但这让我很烦恼.如果我查看System.pas单元,我可以看到DynArraySetLength采用NativeInt参数...一个64位整数(我希望无符号,但不确定).那么为什么Length会返回一个16位有符号整数?这似乎等待发生麻烦,对吧?
我错过了什么?
在64位中,TArray具有类型的长度Int64
.据我所知,没有AreEqual
重载Int64
,因此它尝试使用通用版本:AreEqual<>
.但看起来,从参数来看,它无法决定哪一个.
所以在Win64中,做:
Assert.AreEqual<Int64>(4, Length(r.Values));
Run Code Online (Sandbox Code Playgroud)
要么
Assert.AreEqual(4, Integer(Length(r.Values)));
Run Code Online (Sandbox Code Playgroud)
后者当然是最简单的,因为它应该在Win32和Win64中工作,但可能无法应对非常庞大的数组.
FWIW,Length
不退货Smallint
.但是对于平台之间不同的功能,尤其是"编译魔术"功能Length
,可能会发生这种(错误的)信息.这是IDE的问题,而不是编译器.
正如@RemyLebeau所说,使用它可能更容易NativeInt
.这应该适用于Win32和Win64中,因为NativeInt
是Int32
在Win32和Int64
在Win64中,它也是什么_DynArrayLength
返回:
Assert.AreEqual<NativeInt>(4, Length(r.Values));
Run Code Online (Sandbox Code Playgroud)