Laden...

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

Erstellt von Seikilos vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.253 Views
S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 13 Jahren
Generic: Cannot convert "MeinTyp" to 'T' ?

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

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Seikilos,

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

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 13 Jahren

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

1.274 Beiträge seit 2005
vor 13 Jahren

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

"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

458 Beiträge seit 2007
vor 13 Jahren

Mit Überlagerung meinst du Überladung, oder?

be the hammer, not the nail!

1.552 Beiträge seit 2010
vor 13 Jahren

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