folgendes LinqPad Beispiel Gegeben:Warum benötigt IEnumerable keine Umwandlung, aber eine Liste?
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;}
}
Warum EnumerableMethod
direkt die Liste nehmen kann, während ListMethod
zuerst eine Besetzung braucht?
Ich bekomme, dass eine Besetzung von DbItem zu IDbItem passiert, aber was ist anders an der IEnumerable, die es ermöglicht, die Besetzung ohne eine ausdrückliche Anfrage zu machen?
Ich stelle mir vor, die Antwort beinhaltet das Wort Covariance, aber ich weiß nicht genug darüber, um es mir selbst herauszufinden.
ich, dass ein Hund ist wirklich eine Liste von Hunden und nicht Tiere. Aber warum funktioniert es für IEnumerable? – Vaccano
'IEnumerable' hat keine 'Add'-Methode, so dass man keine Angst hat,' 'Katze'' zu' Hunden' hinzuzufügen. Kovarianz ist etwas, das explizit angegeben werden muss, und die Leute, die 'List' gemacht haben, entschieden, dass es aus dem oben genannten Grund nicht kovariant sein sollte. Die Leute, die "IEnumerable" gemacht haben, entschieden, dass es kovariant sein sollte. – ShadowCat7