| 

.NET C# Java Javascript Exception

3
Also wieso ist folgendes nicht möglich:

Interface:
interface IAnimal
Klasse die IAnimal implementiert:
class Cat : IAnimal
Methode die List<IAnimal> als Parameter hat:
void Stroke(List<IAnimal> list){
// code
}
Benutzer der Methode
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 ;))
12.11.2009
kirt 502 2 7
Eine andere Lösung wäre liste anders zu deklarieren:
List<IAnimal> liste = new List<IAnimal>();
DaSpors 12.11.2009
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! ;)
kirt 12.11.2009
1 Antwort
3
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.
12.11.2009
DaSpors 4,2k 2 8
Danke und ein lesenswerter Artikel!
kirt 13.11.2009

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH