Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Generic: Cannot convert "MeinTyp" to 'T' ?
Seikilos
myCSharp.de - Member



Dabei seit:
Beiträge: 759

Themenstarter:

Generic: Cannot convert "MeinTyp" to 'T' ?

beantworten | zitieren | melden

Ich habe ein Verständnisproblem bei den Generics in dieser Methode:

 protected void creteElement<T>(CreatorBase creator)
      {
        
            T t = (T)(creator.CreateIt());
      }

Das wirft mir die Meldung:

Cannot convert type "MeinTyp" to 'T'

Das sagt er mir bei der definition der Methode. Woher will er dass denn wissen? Ich hab doch noch keine konkrete Instatiierung dieser Methoden mit einem Template Parameter gemacht. Er kann doch T im Moment noch garnicht auflösen.

Die Methode ist so in einer nicht generischen Klasse untergebracht. Ist das das Problem?
Life is a short
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Seikilos,
Zitat
Woher will er dass denn wissen?
das kann er eben nicht wissen. Mit anderen Worten, er kann nicht sicher sein, dass es für jeden Typ, der später eingesetzt wird, eine Konvertierung existiert. Und deshalb sagt er vorsichtshalber, dass die Konvertierung nicht (immer) funktioniert.

Je nach Anwendungsfall kann man sich aber möglicherweise mit

T t = (T)(Object)creator.CreateIt();

behelfen.

herbivore
private Nachricht | Beiträge des Benutzers
Seikilos
myCSharp.de - Member



Dabei seit:
Beiträge: 759

Themenstarter:

beantworten | zitieren | melden

Das mit Object kompiliert. Werde ich testen. Danke.

Aber verwirrend ist es dennoch. Ich kenne das von C++ dass erst der konkrete Template Parameter zur Kompilierung benutzt wird und erst dann wird mit dem bekannten Typ geprüft, ob das, was ich fabriziert habe auch kompiliert
Life is a short
private Nachricht | Beiträge des Benutzers
LastGentleman
myCSharp.de - Member

Avatar #avatar-1696.jpg


Dabei seit:
Beiträge: 1274
Herkunft: Österreich

beantworten | zitieren | melden

Wenn die creator.CreateIt() von dir ist kannst du ja ne generische Überladung machen, die den richtigen Typ zurück gibt.

xxMuroxx hat weiter unten ein Beispiel geposted
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von LastGentleman am .
"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein
private Nachricht | Beiträge des Benutzers
aequitas
myCSharp.de - Member

Avatar #avatar-3079.png


Dabei seit:
Beiträge: 517
Herkunft: Unterfranken

beantworten | zitieren | melden

Mit Überlagerung meinst du Überladung, oder?
be the hammer, not the nail!
private Nachricht | Beiträge des Benutzers
xxMUROxx
myCSharp.de - Member

Avatar #avatar-3236.jpg


Dabei seit:
Beiträge: 1626
Herkunft: Südtirol/Italien

beantworten | zitieren | melden

Hallo Seikilos,

wenn du der Methode ein Constraint anhängsts sollte es auch gehen:
z.b.

protected void creteElement<T>(CreatorBase creator) where T: MyType

Gruß
Michael
Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp
private Nachricht | Beiträge des Benutzers