Kovarianz und Kontravarianz-Inferenz in C # 4.0

8

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

    
devoured elysium 28.04.2010, 21:55
quelle

2 Antworten

8
  

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.

    
Eric Lippert 29.04.2010, 00:26
quelle
0

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.

    
devoured elysium 29.04.2010 00:40
quelle