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
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
}
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.