Se implemento un'interfaccia per un tipo di valore e provo a eseguirne il cast in un elenco del suo tipo di interfaccia, perché questo genera un errore mentre il tipo di riferimento viene convertito correttamente?Perché ToList <Interface> non funziona per i tipi di valore?
Questo è l'errore:
Cannot convert instance argument type
System.Collections.Generic.List<MyValueType>
toSystem.Collections.Generic.IEnumerable<MyInterfaceType>
devo usare esplicitamente il metodo Cast<T>
per convertirlo, perché? Poiché IEnumerable
è un'enumerazione di sola lettura attraverso una raccolta, non ha alcun senso per me che non possa essere trasmesso direttamente.
Ecco esempio di codice per dimostrare il problema:
public interface I{}
public class T : I{}
public struct V: I{}
public void test()
{
var listT = new List<T>();
var listV = new List<V>();
var listIT = listT.ToList<I>(); //OK
var listIV = listV.ToList<I>(); //FAILS to compile, why?
var listIV2 = listV.Cast<I>().ToList(); //OK
}
La varianza non funziona per le strutture. La varianza funziona per i tipi di riferimento perché le loro rappresentazioni (riferimenti/puntatori) mantengono i loro schemi di bit. –
@TheodorosChatzigiannakis dovrebbe essere controverso, non varianza: http://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29 – Fals
@Fals: nessun tipo di varianza funziona per i tipi di valore. – SLaks