Ich habe kürzlich versucht, einen Teil meines Codes zu vereinfachen, indem ich, soweit möglich, Generika verwende. Dieses spezielle Beispiel hat mich jedoch überrascht ... Trotzdem sieht es so unschuldig aus!
Hier ist der fehlerhafte Code (vereinfacht).
%Vor%In Visual Studio erhält der 'vo' in 'Updater (vo)' eine verzerrte Linie und der Compiler (VS2010) meldet:
Der Argumenttyp 'T' kann nicht dem Parametertyp CommodityVO
zugewiesen werden
<T
& gt; verhält sich genauso wie IEnumerable <T
& gt; Ich habe dieses Problem vorerst behoben. Aber ich würde gerne wissen, warum das abgelehnt wurde ... Zumal mir alles gut geht. Was vermisse ich?
Alle Hilfe geschätzt.
Was Sie hier suchen, ist eine generische Einschränkung. Der Typ T
muss auf eine Instanz von CommodityVO
Ohne diese generische Einschränkung hat der C # -Compiler keine Informationen zum generischen Parameter T
und muss den schlimmsten Fall annehmen, dass T
als object
instanziiert wird. Der Typ object
ist nicht kompatibel mit CommodityVO
und gibt daher einen Fehler aus. Durch das Hinzufügen der Einschränkung begrenzen Sie die Werte T
kann in CommodityVO
oder Typen, die von CommodityVO
abgeleitet werden, instanziiert werden, was bedeutet, dass die Konvertierung in CommodityVO
legal ist und daher zulässig ist.
Die Updater-Funktion kann nur Objekte vom Typ CommodityVO
behandeln.
Wenn dies ein Basistyp verschiedener Typen ist, die Sie an Updater übergeben möchten, fügen Sie eine Where-Einschränkung hinzu. where T : CommodityVO