Ich habe ein Buch , das die Kontravarianz / Kovarianz wie folgt erklärt:
- Ein Delegat kann spezifischere Parameter als sein Methodenziel haben. Dies wird Contravarianz
genannt- Der Rückgabetyp eines Delegaten kann weniger spezifisch als der Rückgabetyp seiner Zielmethode sein. Dies wird Kovarianz
genannt
Und das ist ein Beispiel.
%Vor% Ich dachte, um Kovarianz / Kontravarianz zu verwenden, muss new
verwendet werden, wie im Beispiel gezeigt wird, aber ich scheine das gleiche Ergebnis mit sa = ActionObject
und o = RetrieveString
zu erhalten. (Ich testete mit Mono).
new
, um Kovarianz / Kontravarianz zu erklären? object x = Everything inherit from object
beschreibt? Woher kommt dieser komische Name? Was nutzt es dafür? Ich habe ein Buch, das die Kontravarianz / Kovarianz wie folgt erklärt ...
Das ist keine sehr gute Erklärung für die Varianz. Es ist völlig unklar genau was es ist das heißt "Kovarianz" und "Kontravarianz".
Das Ding, das eigentlich eine Variante ist, wird nie erwähnt. Die kontravariante Sache ist die Zuordnung von einem Typ zu einem Delegaten mit einem Parameter dieses Typs . Kontravarianz ist eine Eigenschaft von Zuordnungen und Beziehungen .
Versuchen Sie, dies zu lesen und sehen Sie, ob Sie es besser verstehen:
Ich dachte, um Kovarianz / Kontravarianz zu verwenden, muss man neu verwenden, wie im Beispiel gezeigt wird, aber ich scheine das gleiche Ergebnis zu erhalten ...
Seit C # 2.0 kann man entweder "d = M" oder "d = new D (M)" sagen - der Compiler erkennt sie einfach als zwei verschiedene Möglichkeiten, um dasselbe Ding zu schreiben.
Warum verwendet der Schreiber die Kovarianz / Kontravarianz neu?
Ich weiß es nicht.
Was ist die Theorie hinter der Kovarianz / Kontravarianz Idee?
Die Theorie besagt, dass wenn Sie eine Ordnung Beziehung haben - das heißt, X ist größer als Y, wenn es zulässig ist, X x = (Y) y zu sagen - und Sie haben ein < em> Mapping das behält die Ordnungsbeziehung bei, dann ist das Mapping kovariant. Wenn die Ordnungsbeziehung umkehrt, ist kontravariant .
Angenommen, Animal ist ein größerer Typ als Giraffe. Sie können also einer Variablen vom Typ Animal ein Objekt vom Typ Giraffe zuweisen. Tier & gt; Giraffe.
Machen Sie nun eine Zuordnung von einem Typ T zu einer Methode M-das-braucht-ein-T und zu einem Delegattyp D-das-braucht-ein-T.
Sie können einer Variablen vom Typ D, die eine Giraffe aufnimmt, eine Methode M-das-nimmt-ein-Tier zuweisen. D (Giraffe) & gt; M (Tier) aber Tier & gt; Giraffe. Die Beziehung ist umgekehrt ; Das Mapping ist kontravariant .
Ist es nur ein fantastischer Name, der das Objekt beschreibt x = Alles vom Objekt geerbt?
Nein. Es ist verwandt mit diesem Konzept, weil Objekt ein größerer Typ als fast jeder andere Typ ist. Aber was eigentlich eine Variante ist, ist ein Mapping , das eine Größenbeziehung beibehält oder umkehrt.
Versuchen Sie, dies zu lesen und sehen Sie, ob es hilft.
Woher kommt dieser komische Name?
Kategorientheorie.
Die beste Information, die Kovarianz / Kontravarianz in der C # beschreibt, die ich je gesehen habe, ist eine Reihe von Blog-Posts von Eric Lippert hier . Siehe beginnend am Ende der Liste, elf Teile-Serie.
Es ist manchmal schwer zu lesen. Aber es erklärt alles, was man am Anfang fragen kann. :)
Es wurde vor der eigentlichen C # 4.0-Implementierung geschrieben, daher ist eine Diskussion der Syntax veraltet, aber alles andere scheint wie beschrieben implementiert zu sein.
Keine Ahnung, was Sie in Ihrer ersten Frage meinen.
Die zweite Frage kann beantwortet werden, indem man das Casting anschaut. Die Kontravarianz erlaubt es Klasse A mit einer erweiterten Klasse B als Klasse B zu speichern.
Kontravarianz
%Vor%Kovarianz erlaubt Klasse B, die Klasse A erweitert, aber als Klasse A gespeichert.
Kovarianz
%Vor%Tags und Links c# covariance contravariance