Generics: T nicht dem bekannten Typ zuweisbar. (Warum wird das nicht kompiliert?)

8

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

  • Es scheint nicht wichtig zu sein, was die Art von "vo" ist. zB: string funktioniert auch nicht.
  • Liste <T & gt; verhält sich genauso wie IEnumerable <T & gt;
  • Verschiedene 'where' -Klauseln scheinen keine Wirkung zu haben.
  • 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.

        
    lerenau 02.03.2011, 22:20
    quelle

    3 Antworten

    12

    Was Sie hier suchen, ist eine generische Einschränkung. Der Typ T muss auf eine Instanz von CommodityVO

    beschränkt sein %Vor%

    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.

        
    JaredPar 02.03.2011, 22:21
    quelle
    3

    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

        
    Steven Jeuris 02.03.2011 22:22
    quelle
    3

    Dies sollte funktionieren

    %Vor%

    Sie möchten den generischen Typ T auf einen Typ beschränken, den Ihre Updater-Funktion tatsächlich akzeptiert.

        
    Vadim 02.03.2011 22:22
    quelle

    Tags und Links