IEnumerable<T>
è una variante, ma non supporta il tipo di valore, ma solo il tipo di riferimento. Il codice semplice di seguito è stato compilato correttamente:
IEnumerable<string> strList = new List<string>();
IEnumerable<object> objList = strList;
Ma cambiando da string
a int
si otterrà un errore compilato:
IEnumerable<int> intList = new List<int>();
IEnumerable<object> objList = intList;
Il motivo è spiegato in MSDN :
La varianza si applica solo ai tipi di riferimento; se si specifica un tipo di valore per un parametro di tipo variante, quel parametro di tipo è invariante per il tipo costruito risultante.
Ho cercato e trovato che alcune domande menzionavano il motivo è la boxe tra il tipo di valore e il tipo di riferimento . Ma non mi chiarisce ancora molto perché la boxe è la ragione?
Qualcuno potrebbe fornire una spiegazione semplice e dettagliata perché la covarianza e la contraddizione non supportano il tipo di valore e in che modo la boxe influisce su questo?