Bei Kovarianz und Kontravarianz geht es darum, das Is-a-Prinzip der Vererbung zu verstehen.
In beiden, Kovarianz und Kontravarianz, s.th. wird entweder als Rückgabewert oder als Argument für die Delegate-Methode übergeben. Was "weitergegeben" wird, muss in einem Gefäß "gefangen" werden. In C# - oder Programmierjargon als solche - verwenden wir das Wort Eimer für das, was ich Gefäß genannt habe. Manchmal muss man auf andere Wörter zurückgreifen, um die Bedeutung gebräuchlicher Jargonwörter zu verstehen.
Wie auch immer, wenn Sie Vererbung verstehen, die wahrscheinlich jeder Leser hier wird, dann ist die einzige Sache, darauf zu achten, dass das Gefäß, ich. e. Der für den Fang verwendete Bucket muss vom gleichen Typ oder weniger abgeleiteten Typ sein als der, der übergeben wird - dies gilt sowohl für die Kovarianz als auch für die Kontravarianz.
Vererbung sagt, dass Sie einen Vogel in einem Tiereimer fangen können, weil der Vogel ein Tier ist. Wenn also ein Parameter einer Methode einen Vogel fangen muss, könnte man ihn in einem Tiereimer fangen (ein Parameter vom Typ Tier), was dann eine Kontravarianz ist. Und wenn Ihre Methode, dh Ihr Delegat einen Vogel zurückgibt, dann kann der "Eimer" auch vom Typ Vogel oder weniger abgeleitet (von einem Elterntyp) sein, was bedeutet, dass die Variable, von der Sie den Rückgabewert der Methode abfangen müssen der gleiche oder weniger abgeleitete Typ als der Rückgabewert.
Wechseln Sie einfach Ihr Denken, um zu unterscheiden zwischen dem, was passiert ist und dem, was gefangen wird, da dann alle Komplexität über Kovarianz und Kontravarianz sich gut auflöst. Dann erkennen Sie, dass das gleiche Prinzip am Werk ist. Es ist nur so, dass die Vererbung nicht verletzt werden kann, da sie nur in einer Richtung fließt. Der Compiler ist so intelligent, dass, wenn Sie den Bucket in den spezialisierteren Typ (wieder und wie nötig) umwandeln, dann und nur dann erhalten Sie alle spezialisierten Methoden zurück, die in die abgeleitete Klasse hinzugefügt wurden. Das ist die Schönheit davon. Also, es ist fangen, werfen und benutzen, was Sie haben und vielleicht brauchen.
Ausreichende Alliteration immer amüsiert – Bob
Ich habe versucht, solche Fragen in einem kurzen FAQ-Beitrag zu beantworten: http://blogs.msdn.com/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx Es gibt immer noch eine Menge Verwirrung um dieses Feature ... –