2013-06-19 1 views
0

Delphi2010 компилирует мой класс TObjectListEnumerator без ошибок, но DelphiXE3 дает ошибку компилятора: E2089: Invalid типажDelphiXE3 и недействительный родовая напечатанный

Что не так с этим?

TObjectListEnumerator<T> = class 
     private 
     fList  : TObjectList; 
     fIndex : integer; 
     fMaxIndex : integer; 
     function GetCurrent : T; 
     public 
     constructor Create(List: TObjectList); 
     function MoveNext : Boolean; 
     property Current : T read GetCurrent; 
     end; 

    constructor TObjectListEnumerator<T>.Create(List: TObjectList); 
    begin 
     inherited Create; 
     fList  := List; 
     fIndex := -1; 
     fMaxIndex := fList.Count-1; 
    end; 

    function TObjectListEnumerator<T>.MoveNext: Boolean; 
    begin 
     Inc(fIndex); 
     Result := not(fIndex > fMaxIndex); 
    end; 

    function TObjectListEnumerator<T>.GetCurrent: T; 
    begin 
     Result := T(fList[fIndex]); // <-- E2089: Invalid typecast 
    end; 
+4

Не совсем ответ на ваш вопрос, но так как вы используете генерик, почему бы вам не перейти от непараметризированного 'TObjectList' to 'TObjectList ' от 'System.Generics.Collections'? Я предполагаю, что он автоматически поможет вам, так что вам не понадобится приведение к типу. – Pateman

+0

Спасибо, Патман, приятный намек! Если я использую TObjectList , мне не нужен TObjectListEnumerator . – pKarelian

ответ

1

As the documentation states: свойство Items из Contnrs.TObjectList имеет тип TObject:

property Items[Index: Integer]: TObject read GetItem write SetItem; default; 

С другой стороны, параметр типа T ничем не ограничена и может быть любого типа, например, тип значения, как Integer ,

Если добавить generic type constraint, код должен составить:

TObjectListEnumerator<T: TObject> = class 
+0

Если сначала подумал о 'TObjectListEnumerator = class', но документация [say] (http://docwiki.embarcadero.com/RADStudio/XE3/en/Constraints_in_Generics#Class_Constraint):« Это означает, что фактический тип должен быть ссылкой тип, то есть класс или _interface_ type ". – ventiseis