Laden...

Kovarianz und Kontravarianz

Erstellt von R3turnz vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.875 Views
R
R3turnz Themenstarter:in
125 Beiträge seit 2016
vor 8 Jahren
Kovarianz und Kontravarianz

Hallo,
ich habe diese so verstanden:
Kovarianz: Stat dem angegebenen Rückgabe kann auch ein abgeleiteter Typ verwendet werden.
Kontravarianz: Das gleiche mit Parametern.

Es erninnert mich sehr stark an Polymorphie, wo liegt der Unterschied?
Für welche Typen gibt es den Kovarianz und Kontravarianz?

Bei generischen Typen muss anscheinend in und out angegeben werde, je nachdem ob Rückgabewert oder Parameter. Wieso dies?

LG

16.841 Beiträge seit 2008
vor 8 Jahren

Polymorphismus ist eng gekoppelt, siehe Kovarianz und Kontravarianz. Das Schaubild zeigt es ganz gut.
Was Du mit Typen meinst weiß ich nicht.

in und out muss nicht angegeben, kann aber - ermöglicht eben Kovarianz.

beispiel:

    public class BaseClass
    {
    }

    public class MyClass : BaseClass
    {
    }

Kovarianz, also mit out im Interface:

    public interface IMyCollection<out T> : IEnumerable<T>
    {
    }

    public class MyCollection<T> : IMyCollection<T>
    {
    }

    public class Test
    {
        public Test()
        {
            IMyCollection<MyClass> bag = new MyCollection<MyClass>();
            IMyCollection<BaseClass> baseBag = bag; // funktioniert dank out
        }
    }

Ohne out:

    public interface IMyCollection<T> : IEnumerable<T>
    {
    }

   public Test()
        {
            IMyCollection<MyClass> bag = new MyCollection<MyClass>();
            IMyCollection<BaseClass> baseBag = bag; // geht nicht, Kompilerfehler
        }

W
872 Beiträge seit 2005
vor 8 Jahren

Der Trick bei den generischen Typen in C# ist, daß Generics auf Assembly-Ebene unterstützt werden - d.h. es steht nicht der Quellcode, sondern nur die Metainformation für den JIT-Compiler zur Verfügung. Deswegen muss dem JIT-Compiler geholfen werden.
Ansonsten würde ich Dir Eric Lippert's Blog empfehlen - die Anzahl Artikel zeigt die Komplexität.