У меня есть набор тестов DUnitX, который отлично работает на Win32. Но когда я пытаюсь скомпилировать его для Win64, эта строка выдает ошибку компиляции:
Assert.AreEqual(4, Length(r.Values));
[Ошибка dcc64] ...: E2532 Не удалось вывести аргумент универсального типа из разных типов аргументов для метода AreEqual
r.Values определяется как:
Type TIntegers = TArray<Integer>
Assert.AreEqual имеет разные перегруженные реализации, и dcc64 не может выбрать правильную... хорошо, но почему? И почему dcc32 может скомпилировать это без проблем?
Единственная подсказка, которая у меня есть, заключается в том, что если я наведу указатель мыши, Delphi скажет мне, что длина имеет тип System.Smallint. Не существует реализации Assert.AreEqual с параметрами Smallint... и, конечно же, если я приведу его к Integer, dcc64 скомпилирует его.
Но это меня сильно беспокоит. Если я загляну в модуль System.pas, я увижу, что DynArraySetLength принимает параметр NativeInt... 64-битное целое число (я бы ожидал беззнаковое, но не уверен в этом). Так почему же Length должна возвращать 16-битное целое число со знаком? Казалось бы, неприятности ждут своего часа, не так ли?
Что мне не хватает?