List<Cat> liste = new List<Cat>(); liste.Add(new Cat() { Name = "Miau" }); liste.Add(new Cat() { Name = "Citty" }); Keeper.Stroke(liste);
Folgende Fehler:
The best overloaded method match for 'ListeVererbung.Keeper.Stroke(System.Collections.Generic.List<ListeVererbung.IAnimal>)' has some invalid arguments
Argument '1': cannot convert from 'System.Collections.Generic.List<ListeVererbung.Cat>' to 'System.Collections.Generic.List<ListeVererbung.IAnimal>'
Mich interessiert das wieso ;)
Eine Lösung: Man kann Stroke generisch machen:
Stroke<T>(List<T> liste) where T : IAnimal
(Fall jemand ein besserer Titel einfällt, bitte editieren ;))
Ja, das würde natürlich gehen. ;) Aber ich will eine Liste von Katzen. Und wie erwähnt suche ich keine Lösung sondern eine Begründung wieso es nicht geht! Danke trotzdem für deine Hilfe! ;)
Zum Wieso: Du erstellst mit List<Cat> quasi einen neuen Datentyp. Diesen kann .NET nicht implizit casten auf den Datentyp List<IAnimal>. Das ist im Prinzip so als würdest Du versuchen einen string auf einen int zuzuweisen. Die generischen Listen sehen ähnlich aus und die darin enthaltenen Objekte sind 'kompatibel', aber die Listen an sich sind es nicht. Es gibt einen (englischen) Artikel dazu hier.
Dein Ansatz Stroke generisch zu machen ist der beste Workaround den ich kenne, aber ich persönlich arbeite (um am Beispiel zu bleiben) lieber mit List<IAnimal>, zumal dort ja problemlos Cat, Dog und andere IAnimal implementierende Objekte reinpassen.
List<IAnimal> liste = new List<IAnimal>();