![]() |
[C#] Generische Liste casten
Hallo ihr,
folgendes Szenario:
Code:
public abstract class Guy { ... }
Code:
public class Actor: Guy
{ ... public static IList<Actor> GetActors() { ... } ... }
Code:
lässt sich nicht kompilieren,
IList<Guy> guys = Actor.GetActors();
Code:
wirft eine InvalidCastException.
IList<Guy> guys = (IList<Guy>)Actor.GetActors();
Wieso geht das nicht? Ein Actor ist doch ein Guy. Und wie kann man dieses Problem elegant lösen? Grüße, phXql |
Re: [C#] Generische Liste casten
Ein Actor ist zwar ein Guy, aber ein IList<Actor> ist kein IList<Guy>.
Was spricht dagegen, dass GetActors() ein IList<Guy> zurückgibt? |
Re: [C#] Generische Liste casten
Hm, da hätte sich MS doch ein bisschen was einfallen lassen können, um so was möglich zu machen.
Was dagegen spricht? Typsicherheit. Dann hätt ich mir dieses generische Zeugs sparen können und gleich ganz normal ne Liste von object zurückgeben können... :( |
Re: [C#] Generische Liste casten
Ich weiß nicht, was daran typsicher sein soll, wenn zwei Interfaces, die nicht direkt etwas miteinander zu tun haben, ineinander umgewandelt werden können. Was nützt es dir, den Rückgabewert von GetActors() als IList<Guy> zu behandeln, wenn es per Definition ein IList<Actor> ist? Du hast an dieser Stelle dank der Typsicherheit garantiert, dass du nur Actor-Objekte darin hast und ein Zugriff auf die per Guy ist damit nicht nötig, und an dieser Stelle auch nicht wirklich sinnvoll (das wäre es nur dann, wenn da auch noch andere Guys drin sein könnten - aber das geht ja nicht, weil es ja ein IList<Actor> ist).
|
Re: [C#] Generische Liste casten
Wenn ich
Code:
mache, dann ist in der guy-Variable ein Actor drin, aber die Vererbung garaniert mir, dass Actor alle Methoden hat, die Guy auch hat. Wenn ich das ganze jetzt mit einer Liste machen will, was spricht dagegen, dass man das nicht casten kann?
Guy guy = new Actor()
Eine Liste von Actors hat mit einer Liste von Guys schon was zu tun, nämlich weil ein Actor ein Guy ist. Ich sehe nicht, was dagegen spricht, das casten zu können. |
Re: [C#] Generische Liste casten
Ah hier die Antwort (die ich auch kapiert hab):
Zitat:
|
Re: [C#] Generische Liste casten
Zitat:
Herbis Antwort hat übrigens nur indirekt etwas damit zu tun warum das nicht geht oder wie es gehen könnte. Zitat:
Schaue dir mal List<1>.ConvertAll an, Bei C#3 könntest du auch Ex-Methods nehmen. Das Problem ist übrigens so offensichtlich, dass ich mich immer wieder wunder warum das immer wieder gefragt wird. List<v> hat eine Methode Add, die einen Parameter vom Typen Actor nimmt. Diese Methode implementiert IList<Actor>.Add. IList<Guy>.Add kann ier unmöglich erfüllt sein, da die Signatur nicht stümmt, Ganz zu schweigen davon dass beide Interfaces unterschiedliche Typen sind. |
Re: [C#] Generische Liste casten
Äh nein, Elvis, auf die Notlösung mit foreach bin ich selbst gekommen.
Aber danke für den Tipp mit List.ConvertAll(), mein IntelliSense in SharpDevelop hat mir diese Methode komischerweise gar nicht angezeigt :? (Edit: Hmm okay, IList definiert die Methode nicht, List schon, das erklärts natürlich ^^) Und naja, so offensichtlich finde ich das Problem nun nicht, aber Entschuldigung dass ich gefragt hab ;) gruß, phXql |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz