Covarianza di array C # nelle classi generiche
-
20-08-2019 - |
Domanda
So che C # supporta la covarianza in array come questo:
object[] array = new string[3];
Ma ricevo un errore quando tenta di compilare il codice seguente
class Dummy<K,T> where T:K
{
public void foo()
{
K[] arr = new T[4];
}
}
Dice " Impossibile convertire implicitamente il tipo 'T []' in 'K []' "
Perché visualizzo questo errore ???
Soluzione
Devi specificare che sia T che K sono tipi di riferimento. La covarianza dell'array funziona solo con tipi di riferimento. Modificare la dichiarazione in:
class Dummy<K,T> where T : class, K
e funziona benissimo. Non è necessario specificare che K è un tipo di riferimento, perché se T è un tipo di riferimento e deriva o implementa K, anche K deve essere un tipo di riferimento. (Almeno presumo che sia il ragionamento. Non fa male aggiungere dove K: class
anche per chiarezza.)
Altri suggerimenti
il tipo T deve supportare la conversione implicita in K.E.g.
T a = new T (); K b = a;
deve essere valido.