none
Kovarianz RRS feed

  • Frage

  • Hallo zusammen,

    mich würde interessieren ob es eine Möglichkeit gibt unter Phone 7 kovariante Interfaces zu nutzen. Das folgende Beispiel kompiliert einwandfrei, es wird sogar korrekt bemängelt, falls das Interface kontravariant erweitert wird. Bei der Ausführung kommt es jedoch zu diveresen Problemen (Typ nicht gefunden, TargetInvocationException, ...) beim Instanziieren. Hier das Beispiel:

    
    public interface ITestInterface<out T>
    {
    T GetValue { get; }
    }

    public class TestClass<T> : ITestInterface<T>
    {
    private T _t = default(T);

    public T GetValue { get { return _t; } }
    }
    ...
    ITestInterface<int> = new TestClass<T>;

    Mache ich hier etwas grundlegend Falsch oder wird die Kovarianz vom Laufzeitssystem einfach nicht unterstützt?

    Freitag, 22. Oktober 2010 10:49

Antworten

  • Servus Alexander,

     

    Kovarianz bedeutet ja im grunde "...in Richtung der Vererbungshierachie..."! Somit müsste deine Zuweisung vom spezialisierten Typ zum Basistyp gehen.

    Beispiel Kovarianz:

    List<Tier> tierliste = new List<Tier>();
    
    Hund bello = new Hund();
    
    tierliste.add(bello);


    Tier ist in diesem Beispiel der Basistyp vom dem die Hund-Klasse erbt. Durch Kovarianz kann die tierliste nun das Hund-Object aufnehmen!  
    Sonntag, 24. Oktober 2010 18:06
  • Genau auf diesen Fehler spielte ich eigentlich an! Deshalb meine kleine Ausführung von wegen "Richtung Vererbungshierachie". Aber ok, hätte ich deutlicher schreiben sollen. 

    Nun hatte ich etwas mehr Zeit. Habe es nun auch getestet und komme mit einer schlechten Nachricht!

    Die Apps, die wir schreiben sind zwar Silverlight und XNA, jedoch basiert ein WP7 Gerät auf der Compact Framework CLR und diese kennst die neuesten C#4.0 Sprachfeatures leider nicht. Somit kannst Du gernerische konvariante Interfaces und der Gleichen leider nicht benutzen. Dies gilt natürlich auch für Kontravarianz.

     

    Gruß,

    Ben

     

    Mittwoch, 27. Oktober 2010 08:08

Alle Antworten

  • Servus Alexander,

     

    Kovarianz bedeutet ja im grunde "...in Richtung der Vererbungshierachie..."! Somit müsste deine Zuweisung vom spezialisierten Typ zum Basistyp gehen.

    Beispiel Kovarianz:

    List<Tier> tierliste = new List<Tier>();
    
    Hund bello = new Hund();
    
    tierliste.add(bello);


    Tier ist in diesem Beispiel der Basistyp vom dem die Hund-Klasse erbt. Durch Kovarianz kann die tierliste nun das Hund-Object aufnehmen!  
    Sonntag, 24. Oktober 2010 18:06
  • Hallo!

    Wie ich schon in meiner Frage geschrieben habe geht es mir um die Nutzung kovarianter Interfaces(!), also um generische Interfaces bei denen der Typparameter mit dem "out"-Modifier versehen ist. (Vielleicht ist hier der Titel der Frage nicht spezifisch genug.) Dieses Sprachfeature ist mit C# 4.0 eingeführt worden und wird für WP7 auch ordnungsgemäß kompiliert. Nur zur Laufzeit scheint es nicht unterstützt zu werden. Das genannte Beispiel hat hiermit leider nichts zu tun, schon allein weil für eine Deutung von "Kovarianz" mindestens zwei Typhierarchien betrachtet werden müssen.

    Bedauerlicherweise habe ich auch noch einen Fehler in meinem Beispiel gefunden, keine Ahnung was ich mir dabei ursprünglich gedacht habe. Die letzte Zeile müsste eigentlich lauten:

    ITestInterface<object> test = new TestClass<String>;

    ITestInterface<object> und TestClass<String> sind hierbei kovariant, weil sowohl TestClass<T> ein Subtyp von ITestInterface<T> ist, also auch String ein Subtyp von object. Da der ITestInterface-Typparameter nur in Rückgabewerten auftaucht und damit als "out" deklariert werden kann, sollte man typsicher test.GetValue aufrufen können.

    Soweit zumindest die Theorie...

    Dienstag, 26. Oktober 2010 17:04
  • Genau auf diesen Fehler spielte ich eigentlich an! Deshalb meine kleine Ausführung von wegen "Richtung Vererbungshierachie". Aber ok, hätte ich deutlicher schreiben sollen. 

    Nun hatte ich etwas mehr Zeit. Habe es nun auch getestet und komme mit einer schlechten Nachricht!

    Die Apps, die wir schreiben sind zwar Silverlight und XNA, jedoch basiert ein WP7 Gerät auf der Compact Framework CLR und diese kennst die neuesten C#4.0 Sprachfeatures leider nicht. Somit kannst Du gernerische konvariante Interfaces und der Gleichen leider nicht benutzen. Dies gilt natürlich auch für Kontravarianz.

     

    Gruß,

    Ben

     

    Mittwoch, 27. Oktober 2010 08:08