Warum kann ich eine TObjectListS: T nicht an eine Funktion übergeben, die TObjectListT erwartet?

8

Ich habe ein Problem mit meinem Code, der generische Typen verwendet. Warum weiß der Compiler nicht, dass die übergebene Liste ( Result ) ein TObjectList<TItem> ist ( TItem ist ein Typ für T in TItems )?

Schnittstelle:

%Vor%

Implementierung:

%Vor%     
robertw 27.04.2012, 16:47
quelle

2 Antworten

3

In der Funktion mit dem Fehler ist Result ein TObjectList<T> , wobei T eine Unterklasse von TItem ist, aber der Compiler weiß nicht, um welche spezifische Klasse es sich handelt. Der Compiler muss es so kompilieren, dass es für beliebigen Wert von T ausgeführt werden kann. Dies ist möglicherweise nicht mit dem Argumenttyp von LoadAll kompatibel, für den ein TObjectList<TItem> erforderlich ist, sodass der Compiler den Code zurückweist.

Angenommen, T ist TItemDescendant , und der Compiler ermöglicht das Kompilieren und Ausführen des fehlerhaften Codes. Wenn LoadAll AList.Add(TItem.Create) aufruft, behält AList am Ende etwas, das kein TItemDescendant ist, obwohl es ein TObjectList<TItemDescendant> ist. Es enthält ein Objekt eines Typs, der sich von dem unterscheidet, was sein generischer Typparameter besagt.

Nur weil S ein Untertyp von T ist, bedeutet dies nicht, dass X<S> ein Untertyp von X<T> ist.

    
Rob Kennedy 27.04.2012, 17:51
quelle
4

Sie müssen auch eine generische Version des Loaders verwenden:

%Vor%     
Jouni Aro 27.04.2012 21:46
quelle

Tags und Links