Qual è il motivo reale per tale limite? È solo un lavoro da fare? Concettualmente è difficile? È impossibile?Perché C# (4.0) non consente la co- e controvarianza nei tipi di classi generiche?
Certo, non è possibile utilizzare i parametri di tipo nei campi, perché sono sempre in lettura e scrittura. Ma quella non può essere la risposta, vero?
Il motivo di questa domanda è che sto scrivendo un articolo sul supporto delle varianze in C# 4, e sento che dovrei spiegare perché è limitato ai delegati e alle interfacce. Giusto per invertire l'onere della prova.
Aggiornamento: Eric ha chiesto un esempio.
Che dire di questo (non so se questo ha un senso, ma :-))
public class Lookup<out T> where T : Animal {
public T Find(string name) {
Animal a = _cache.FindAnimalByName(name);
return a as T;
}
}
var findReptiles = new Lookup<Reptile>();
Lookup<Animal> findAnimals = findReptiles;
La ragione per avere che in una classe potrebbe essere la cache che si tiene nella classe stessa. E per favore non nominare i tuoi diversi tipi di animali domestici uguali!
BTW, questo mi porta a optional type parameters in C# 5.0 :-)
Update 2: Non sto sostenendo il CLR e C# dovrebbe consentire questo. Sto solo cercando di capire cosa ha portato a ciò che non funziona.
Certo, questo è un esempio ragionevole ma non hai mostrato nulla che non possa essere fatto anche con le interfacce. Basta creare l'interfaccia ILookup e cercare l'applicazione . Quale avvincente vantaggio aggiuntivo sulla varianza dell'interfaccia lo scenario per la varianza di classe si aggiunge? –
Nessuno, in realtà. Oltre a ciò è meno codice. Fatemi inverso l'onere della prova. Come potremmo spiegare perché non è supportato. Non sto chiedendo di implementarlo, in realtà. "È sempre stato così" non conta! :-) –
Non è necessario fornire una giustificazione per * non * l'implementazione di una funzione. Non implementare una funzionalità è * gratuito *. Piuttosto, dobbiamo fornire una giustificazione per l'implementazione di una funzionalità: le funzionalità possono costare milioni di dollari a Microsoft e imporre un onere ancora maggiore ai nostri clienti che devono quindi spendere tempo e denaro per apprendere la funzionalità. –