C # -Array Kovarianzstrukturen Generic Classes
-
20-08-2019 - |
Frage
Ich weiß, dass C # Kovarianz in Arrays wie folgt unterstützt:
object[] array = new string[3];
Aber ich bin immer einen Fehler, wenn es versucht, den folgenden Code zu kompilieren
class Dummy<K,T> where T:K
{
public void foo()
{
K[] arr = new T[4];
}
}
Er sagt: "Kann nicht implizit Typ 'T []' auf 'K []' convert"
Warum erhalte ich diesen Fehler ???
Lösung
Sie müssen angeben, dass sowohl T und K Referenztypen sind. Matrixkovarianz funktioniert nur mit Referenztypen. Ändern Sie die Deklaration:
class Dummy<K,T> where T : class, K
und es funktioniert gut. Sie müssen nicht angeben, dass K ein Referenztyp ist, denn wenn T ein Verweistyp ist, und es ergibt sich aus oder K implementiert, dann K auch einen Referenztyp sein muss. (Zumindest gehe ich davon aus, das ist die Begründung. Es ist nicht where K : class
auch für Klarheit hinzufügen schadet.)
Andere Tipps
Typ T hat implizite Konvertierung in K. Z. B zu unterstützen.
T a = new T (); K b = a;
muss gültig sein.