Dati i seguenti LINQPad esempio:Perché IEnumerable non ha bisogno di un cast ma di una lista?
void Main()
{
List<DbItem> dbItems = new List<DbItem>
{
new DbItem{Id = 4, SomeValue = "Value For 4", OtherValue = 1},
new DbItem{Id = 19, SomeValue = "Value For 19", OtherValue = 2}
};
ListMethod(dbItems.Cast<IDbItem>().ToList()); <-+
EnumerableMethod(dbItems); <-+
} |
|
// These are the methods are I asking about -------+
public void ListMethod(List<IDbItem> dbItems)
{
Console.WriteLine(dbItems);
}
public void EnumerableMethod(IEnumerable<IDbItem> dbItems)
{
Console.WriteLine(dbItems);
}
public class DbItem : IDbItem
{
public int Id {get; set;}
public string SomeValue {get; set;}
public int OtherValue {get; set;}
}
public interface IDbItem
{
int Id {get; set;}
string SomeValue {get; set;}
}
Perché può EnumerableMethod
prendere direttamente la lista mentre ListMethod
ha bisogno di un cast in primo luogo?
Capisco che un cast stia accadendo da DbItem a IDbItem, ma cosa c'è di diverso nell'IEnumerable che gli permette di fare il cast senza una richiesta esplicita?
Immagino che la risposta implichi la parola Covariance, ma non ne so abbastanza per capirlo da solo.
ottengo che un cane è in realtà una lista di cani e non animali. Ma allora perché funziona per IEnumerable? – Vaccano
'IEnumerable' non ha un metodo' Add', quindi non c'è paura di aggiungere un 'Cat' a' dogs'. La covarianza è qualcosa che deve essere esplicitamente specificato, ei ragazzi che hanno fatto 'Elenco' hanno deciso che non dovrebbe essere covariante per la ragione sopra. I ragazzi che hanno fatto "IEnumerable" hanno deciso che dovrebbe essere covariante. – ShadowCat7