Hello,
ich schlage mich gerade mit Generics in C# rum. Seit gestern stehe ich vor einem Problem, das offenbar aus der speziellen Umsetzung in C# resultiert. Ich entnehme gegoogelten Artikeln, dass ich sich um die Covarianz der Generics handelt, die mir das Genick bricht. Schön, hilft mir aber noch nicht.
Folgendes ist das Szenario:
(1) Definition eines generischen Provider Interfaces
interface IDataProvider<D, I>
(2) Definition einer Exception, die als Parameter einen IDataProvider bekommt (throw new MyException(this)).
Hier fordert der Compiler jetzt eine Typisierung ein.
2.1 Aus der Javawelt kommend würde ich einen Wildcard verwenden
MyException(IDataProvider<? extends Object, ? extends Object>)
--> das mag C# dank fehlender Wildcards nicht?!
2.2 gut dachte ich, definierst du ihn halt als Object:
MyException(IDataProvider<object, object>)
--> das funktioniert, allerdings ist ein IDataProvider(string, string) leider in C# kein Subtyp von IDataProvider(object, object)?!
2.3 also definiere ich die Exception selbst als generisch
MyException<D, I>
MyException(IDataProvider<D, I>)
Das funktioniert, zwingt mich jetzt aber beim Werfen der Exception dazu, die Exception entsprechend zu typisieren. Erscheint mir etwas viel für ein
throw new MyException(this).
Wie löst man dann in C# so ein Problem? Viele Artikel befassen sich mit Lösungsansätzen, allerdings kann ich z.B. ein "where T : string" auf Grund der Typrestriktionen nicht verwenden. Was tut man also? Wie kriegt man das handlich? Kann man (sollte man) irgendwo auf nicht-generische Typen casten?
Danke, ich geh jetzt arbeiten, zurück in meine Java-Welt.
MfG
Rouven
-------------------
sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
Inter Arma Enim Silent Leges -- Cicero