Wie deklariere und verwende ich generische Interfaces (siehe Namespace Sample2), um auf die gleiche Weise wie mit Klassen im Namespace Sample1 zu arbeiten?
Ich weiß, dass es eine Problemumgehung gibt (siehe Namespace Sample2Modified), aber das ist nicht das, was ich versuche zu erreichen.
Bei Klassen funktioniert das gut:
%Vor%Bei Interfaces gibt der Compiler jedoch diese Warnung aus, wenn er die Eigenschaft in ClassSampleDoesNotWork deklariert:
%Vor%Code:
%Vor%Wenn ich die Klasse modifiziere, um TEnumerableOfItem anstelle von TItem zu haben, funktioniert es:
%Vor% Versuchen Sie, class
constraint zu TItem
hinzuzufügen:
Das funktioniert, weil Varianz nur für Referenztypen funktioniert (oder es gibt eine Identitätskonvertierung). Es ist nicht bekannt, dass TItem
der Referenztyp ist, es sei denn, Sie fügen : class
hinzu.
Lesen Sie diesen Artikel für weitere Informationen.
Hier ist ein Beispielcode, um dieses Verhalten zu demonstrieren: