В некотором коде, который я исправляю, который интенсивно использует обобщенные и интерфейсные типы, я получаю ошибку
E2134, Type '<void>' has no type info.
Я полагаю, что это потому, что я нахожусь в середине рефакторинга, где некоторые глубокоВложенный набор модулей, которые используют универсальные элементы, не синхронизирован, но ошибка не возникает в месте, где я могу использовать сообщение об ошибке для исправления кода, потому что в коде нет ничего плохого в месте, гдепоявляется ошибка.
Вот контекст, смоделированный, потому что я не могу опубликовать код, его слишком много:
unit GenericThing;
...
interface
...
type
...
IThingListOf<ThingT> = interface( IThingContainer )
function getEnumerator: TEnumerator<ThingT>;
function getCount: Integer;
function getThing( Index: integer ): ThingT;
function getFirst: ThingT;
function IndexOf( value: ThingT): integer;
function addItem( const Thing: ThingT ): ThingT;
function removeItem( const Thing: ThingT ): Integer;
procedure clear;
procedure Sort; overload;
procedure Sort(const AComparer: IComparer<ThingT>); overload;
property Count: integer read getCount;
property First: ThingT read getFirst;
property Items[Index: integer]: ThingT read getThing; default;
end;
// error appears on whatever line number comes after the declaration of IThingListOf<ThingT>...end;
function AnythingYouLikeHere:Integer; // there is nothign wrong with this line, but you get the E2134 here.
Похоже, проблема в самом IThingContainer:
IThingContainer = interface ...
...
procedure DoSomething(const Param);
end;
Выше "const Param" нет информации о типе.На мой взгляд, это странная (подмышка) Паскаля / Дельфи, когда вы полностью нарушаете идею Вирта о строгой типизации.Он примерно так же слабо типизирован, как указатель «void *» в C или тип «Pointer» в Delphi, но он используется редко, кроме как в местах, подобных стандартным функциям RTL пред-объектного паскаля, таких как Move и т. Д.на.По моему мнению, нетипизированные параметры в интерфейсах, используемые в обобщениях, должны быть либо разрешены, либо запрещены, но не разрешены иногда, а запрещены в других случаях.
Это случай, когда особенность Паскаля 1978 года плохо смешивалась сфункция ObjectPascal с 2009 года.