Wenn wir unsere Schnittstellen in C # 4.0 definieren, dürfen wir jeden der generischen Parameter als in
oder out
kennzeichnen. Wenn wir versuchen, einen generischen Parameter als out zu setzen und das zu einem Problem führen würde, löst der Compiler einen Fehler aus, der uns das nicht erlaubt.
Frage:
Wenn der Compiler Möglichkeiten hat, zu folgern, was für covariance
( out
) und contravariance
( in
) gültig ist, warum müssen wir Schnittstellen als solche markieren? Wäre es nicht genug, die Schnittstellen wie immer zu definieren, und wenn wir versuchen, sie in unserem Client-Code zu verwenden, einen Fehler melden, wenn wir versuchen, sie auf eine unsichere Weise zu verwenden?
Beispiel:
%Vor%Auch
ist es nicht, was Java in der gleichen Situation tut? Soweit ich mich erinnere, tun Sie einfach etwas wie
%Vor%Oder mische ich Dinge?
Danke
Wenn der Compiler Möglichkeiten hat, abzuleiten, welche Anwendungen sowohl für die Kovarianz (out) als auch für die Kontravarianz (in) gültig sind, warum müssen wir Schnittstellen als solche kennzeichnen?
Ich bin mir nicht ganz sicher, ob ich die Frage verstehe. Ich denke, du fragst zwei Dinge.
1) Kann der Compiler die Varianzanmerkungen ableiten?
und
2) Warum unterstützt C # Call-Site-Varianz nicht wie Java?
Die Antwort auf die erste lautet:
%Vor%Ich lade Sie ein, zu versuchen, abzuleiten, was alle rechtlich möglichen Varianzannotationen auf V und W sind. Sie könnten eine Überraschung bekommen.
Wenn Sie für diese Methode keine eindeutige Best-Varianz-Annotation herausfinden können, warum glauben Sie dann, dass der Compiler das kann?
Weitere Gründe hier:
Allgemeiner: Ihre Frage weist auf falsche Schlussfolgerungen hin. Die Fähigkeit, billig zu prüfen, ob eine Lösung korrekt ist, bedeutet logischerweise nicht, dass es eine billige Möglichkeit gibt, eine korrekte Lösung zu finden. Zum Beispiel kann ein Computer leicht überprüfen, ob p * q == r für zweitausendstellige Primzahlen p und q wahr oder falsch ist. Das bedeutet nicht, dass es einfach ist, r zu nehmen und p und q zu finden, so dass die Gleichheit erfüllt ist. Der Compiler kann leicht überprüfen, ob eine Varianzannotation korrekt oder falsch ist. das bedeutet nicht, dass es eine korrekte Varianzannotation unter den möglichen Milliarden möglicher Anmerkungen finden kann.
Die Antwort auf die zweite lautet: C # ist nicht Java.
OK, hier ist die Antwort auf das, was ich gefragt habe (aus Erics Antwort): Ссылка
Erstens scheint mir diese Varianz sollte etwas sein, was du bist entwerfen Sie bewusst in Ihr Schnittstelle oder Delegat. Mach es einfach Start passiert ohne Kontrolle durch die Benutzer arbeitet gegen dieses Ziel und auch kann brechende Änderungen einführen. (Mehr auf denen in einem späteren Beitrag!)
Dies bedeutet automatisch auch das wie der Entwicklungsprozess weitergeht und Methoden werden zu Schnittstellen hinzugefügt, die Die Varianz der Schnittstelle kann sich ändern unerwartet. Dies könnte einführen unerwartete und weitreichende Veränderungen woanders im Programm.
Ich habe mich entschieden, es hier explizit zu erwähnen, weil sein Link zwar die Antwort auf meine Frage hat, aber der Beitrag selbst nicht.
Tags und Links java c# generics covariance contravariance