Siccome non so come si chiama il mio problema, non posso garantire che nessuno abbia mai fatto la stessa domanda di recente o del tutto.Informazioni su Generics ed Ereditarietà (perdonami il mio brutto titolo)
Ho notato, tuttavia, che ci sono alcuni thread con un titolo simile, ma non sembrano essere rilevanti per il mio problema.
Ho una classe elenco personalizzata, che implementa Generics.
class MyList<T>
{
public void add(T item) // adds an item to the list
{ /* code */ }
public void add(MyList<T> list) // attaches an existing list to the end of the current one
{ /* code */ }
}
Ho anche le classi:
class Apple : Fruit
e
class Banana : Fruit
Ora, arriva il codice rilevante:
MyList<Fruit> fruitList = new MyList<Fruit>();
// fill fruitList
fruitList.add(new Apple()); // works, of course
fruitList.add(new Banana()); // works as well, of course
MyList<Apple> appleList = new MyList<Apple>();
// fill appleList
fruitList.add(appleList); // doesn't work. Why?
Anche se appleList è una MyList (Of Apple) e Apple è Fruit, VisualStudio non accetta t MyList (Of Apple) come argomento, quando viene chiesto MyList (Of Fruit).
Tuttavia, se dovessi dichiarare l'elenco come questo:
MyList<object> fruitList = new MyList<object>();
Poi tutto funziona di nuovo. Cosa ho fatto di sbagliato?
Una risposta sarebbe molto apprezzata, e grazie per aver dedicato del tempo a leggere, anche senza rispondere.
FYI, il le principali parole chiave su questo sono covarianza, controvarianza e invarianza. Sì, è piuttosto difficile da trovare quando non lo sai. – delnan
Dovresti implementare 'IList'. –
SLaks
I nomi dei membri pubblici in .Net devono essere UpperCamelCase. – SLaks