Eines der meistbegrüßten Features aus .NET 4 und gleichzeitig eines der am wenigsten verstandenen. Leicht dahergesagt, dass Argumente von Methoden und Delegates schon immer contravariant waren. Und dass in C# 4.0 jetzt noch sichere Co- und Contravarianz für generische Typparameter hinzukommt. Und weil man das mit Co- und Contra so schnell verwechselt heißt es jetzt einfach "out" und "in". Oder war das andersrum? Nicht ganz sicher? Nach dem Vortrag weißt Du es!
Alles Vertragssache - Ko- und Kontravarianz in C# 1-4
1. Alles
Vertragssache!
Ko- und Kontravarianz in C#
Lars Corneliussen
itemis AG
itemis.de
lcorneliussen.com
Mittwoch, 25. November 2009
2. Kovarianz und Kontravarianz ist die
Unterscheidung, ob ein Aspekt
gleichartig der
Vererbungsrichtung (kovariant)
oder
entgegengesetzt zu dieser
(kontravariant)
ist.
Mittwoch, 25. November 2009
5. Ko- und Kontravarianz
... beschreibt die erlaubte Abweichung vom
deklarierten Typ.
Mittwoch, 25. November 2009
6. object
Vererbungrichtung
string
Mittwoch, 25. November 2009
7. deklarierter Typ
Vererbungrichtung
object string
object meinObjekt = "abcd";
Mittwoch, 25. November 2009
8. deklarierter Typ
Vererbungrichtung
object string
object meinObjekt = "abcd";
Abweichung
Mittwoch, 25. November 2009
9. deklarierter Typ
Vererbungrichtung
object string
object meinObjekt = "abcd";
Abweichung
kontravariant
Mittwoch, 25. November 2009
10. public string Methode( object parameter) {
return "Hallo, Welt!";
}
object x = Methode( "abc" );
Mittwoch, 25. November 2009
11. deklarierter Typ
object
public string Methode( object parameter) {
return "Hallo, Welt!";
}
Vererbungrichtung
string
object x = Methode( "abc" );
Mittwoch, 25. November 2009
12. deklarierter Typ
object
public string Methode( object parameter) {
return "Hallo, Welt!";
}
Abweichung
Vererbungrichtung
string
object x = Methode( "abc" );
Mittwoch, 25. November 2009
13. Variablen und Parameter
sind kontravariant
... sie erlauben Zuweisungen von Werten,
deren Typen entgegengesetzt zur
Vererbungsrichtung abweichen.
Mittwoch, 25. November 2009
14. public string Methode( object parameter) {
return "Hallo, Welt!";
}
object x = Methode( "abc" );
Mittwoch, 25. November 2009
15. deklarierter Typ
string
public string Methode( object parameter) {
return "Hallo, Welt!";
}
Vererbungrichtung
object
object x = Methode( "abc" );
Mittwoch, 25. November 2009
16. deklarierter Typ
string
public string Methode( object parameter) {
return "Hallo, Welt!";
}
Vererbungrichtung
Abweichung
object
object x = Methode( "abc" );
kovariant
Mittwoch, 25. November 2009
17. Methodenrückgaben
sind kovariant
... sie können Variablen zugewiesen werden,
deren Typ gleichartig mit der
Vererbungsrichtung abweicht.
Mittwoch, 25. November 2009
27. List< >
Peter
IList< >
Mittwoch, 25. November 2009
28. List< >
Peter
Klaus IList< >
Mittwoch, 25. November 2009
29. List< >
Peter
IList< >
Mittwoch, 25. November 2009
30. Bis C# 3.0 sind
generische Typparameter
invariant
... sie können in der Benutzung nicht vom
implementierten Typ abweichen.
Mittwoch, 25. November 2009
31. C# 4 unterstützt...
... sichere Ko- und Kontravarianz von
generischen Typparametern.
Mittwoch, 25. November 2009
32. Sehen wir uns mal ein
paar Varianten an...
Mittwoch, 25. November 2009
59. Generische Schnittstelle
Implementierung ITiermarkt<in I, out O>
+ O Tauschen( I )
Tauschen( ) { ITiermarkt<Säugetier,
Säugetier>
?? + Tauschen( )
Konkrete Schnittstelle
return
}
Mittwoch, 25. November 2009
60. Generische Schnittstelle
Implementierung ITiermarkt<in I, out O>
+ O Tauschen( I )
Tauschen( ) { ITiermarkt<Säugetier,
Säugetier>
?? + Tauschen( )
Konkrete Schnittstelle
return
}
Mittwoch, 25. November 2009
61. ITiermarkt<Giraffe, Tier>.Tauschen() Ve
rer
Ab bu
we ngr
ich ich
un tu
g ng
ITiermarkt<Säugetier, Säugetier>
Säugetier Tauschen ( Säugetier)
Vererbungrichtung
Mittwoch, 25. November 2009
62. In C# 4 Generische
Typparameter
ENTWEDER
ko- ODER kontravariant
... mit „out“ klassifizierte Typparameter
können kovariant abweichen,
... mit „in“ klassifizierte Typparameter
können kontravarian abweichen.
Mittwoch, 25. November 2009
63. Vielen Dank
fürs Zugucken!
Lars Corneliussen
lcorneliussen.com
Mittwoch, 25. November 2009