AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[C#] Generische Liste casten

Ein Thema von phXql · begonnen am 25. Aug 2007 · letzter Beitrag vom 26. Aug 2007
Antwort Antwort
Benutzerbild von phXql
phXql

Registriert seit: 11. Mär 2004
Ort: Mühldorf
824 Beiträge
 
#1

[C#] Generische Liste casten

  Alt 25. Aug 2007, 15:06
Hallo ihr,

folgendes Szenario:

Code:
public abstract class Guy { ... }
Code:
public class Actor: Guy
{
...
public static IList<Actor> GetActors() { ... }
...
}
Code:
IList<Guy> guys = Actor.GetActors();
lässt sich nicht kompilieren,
Code:
IList<Guy> guys = (IList<Guy>)Actor.GetActors();
wirft eine InvalidCastException.

Wieso geht das nicht? Ein Actor ist doch ein Guy.
Und wie kann man dieses Problem elegant lösen?

Grüße, phXql
"Dunkel die andere Seite ist"
"Yoda! Halts Maul und iss deinen Toast!"
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#2

Re: [C#] Generische Liste casten

  Alt 25. Aug 2007, 15:24
Ein Actor ist zwar ein Guy, aber ein IList<Actor> ist kein IList<Guy>.
Was spricht dagegen, dass GetActors() ein IList<Guy> zurückgibt?
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Benutzerbild von phXql
phXql

Registriert seit: 11. Mär 2004
Ort: Mühldorf
824 Beiträge
 
#3

Re: [C#] Generische Liste casten

  Alt 25. Aug 2007, 15:31
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...
"Dunkel die andere Seite ist"
"Yoda! Halts Maul und iss deinen Toast!"
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#4

Re: [C#] Generische Liste casten

  Alt 25. Aug 2007, 15:35
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).
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Benutzerbild von phXql
phXql

Registriert seit: 11. Mär 2004
Ort: Mühldorf
824 Beiträge
 
#5

Re: [C#] Generische Liste casten

  Alt 25. Aug 2007, 15:38
Wenn ich
Code:
Guy guy = new Actor()
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?

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.
"Dunkel die andere Seite ist"
"Yoda! Halts Maul und iss deinen Toast!"
  Mit Zitat antworten Zitat
Benutzerbild von phXql
phXql

Registriert seit: 11. Mär 2004
Ort: Mühldorf
824 Beiträge
 
#6

Re: [C#] Generische Liste casten

  Alt 25. Aug 2007, 15:48
Ah hier die Antwort (die ich auch kapiert hab):

Zitat:
... wenn du die Liste gecastet hättest, wäre sie statisch vom Typ IList<Guy> (d.h. die Variable, über die du zugreifst, wäre dann vom Typ IList<Guy>), aber der dynamische Typ wäre immer noch IList<Actor> (sprich das Objekt bleibt ja dasselbe und wird durch den Cast nicht geändert). Also auch durch den Cast bleibt das Listen-Objekt dasselbe und hat kann damit weiterhin nur Actors aufnehmen. ...
Na gut, dann doch umkopieren mit foreach.
"Dunkel die andere Seite ist"
"Yoda! Halts Maul und iss deinen Toast!"
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#7

Re: [C#] Generische Liste casten

  Alt 25. Aug 2007, 19:39
Zitat von phXql:
Ah hier die Antwort (die ich auch kapiert hab):
OMG, bitte nicht dieses Forum...
Herbis Antwort hat übrigens nur indirekt etwas damit zu tun warum das nicht geht oder wie es gehen könnte.
Zitat:
Na gut, dann doch umkopieren mit foreach.
Ja sicher, weil dir das jemand in einem Forum voller MS-geiler Ex-VB'lern gesagt hat?
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.
Robert Giesecke
  Mit Zitat antworten Zitat
Benutzerbild von phXql
phXql

Registriert seit: 11. Mär 2004
Ort: Mühldorf
824 Beiträge
 
#8

Re: [C#] Generische Liste casten

  Alt 26. Aug 2007, 09:23
Ä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
"Dunkel die andere Seite ist"
"Yoda! Halts Maul und iss deinen Toast!"
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz