Kann ich ein Typ, der beide ist, kovariante und kontra, das heißt vollständig fungibel / veränderbar mit Unter und Supertypen?

StackOverflow https://stackoverflow.com/questions/2809932

Frage

Kann ich einen Typ haben (jetzt seine Semantik zu vergessen), die kovariante sowie kontra sein kann?

Beispiel:

public interface Foo<in out T>
{
    void DoFooWith(T arg);
}

Aus, um Eric Lippert Blog für das Fleisch und Kartoffeln der Varianz in C # 4.0 als es wenig sonst überall, dass Abdeckungen ausreichender Boden zum Thema.


Ich versuchte es trotzdem aus, nicht nur, dass es nicht zulassen, dass, aber es sagt mir, dass ich den ganzen Punkt bin fehle. Ich brauche die Verbindung zwischen Read-Only, Nur-Schreib-und Varianz zu verstehen.

Ich glaube, ich habe einige mehr lesen zu tun.

Aber alle kurz, Epiphanie Induzierung Antworten sind willkommen, mittlerweile.

War es hilfreich?

Lösung

Nein, Sie können das nicht tun.

Nehmen wir an, legal waren. Sie machen einen IFoo<Giraffe>. Da IFoo covariant in T ist, können Sie es über typsichere Referenz Umwandlung in IFoo<object> konvertieren. Da es kontra ist, können Sie das zu IFoo<Banana> konvertieren. Was mögliche Semantik gibt es für IFoo<T>, so dass es sinnvoll, eine IFoo der Giraffen auf eine IFoo von Bananen in die Lage macht über Referenz Konvertierung zu konvertieren? Giraffen und Bananen haben nichts gemein andere als Referenztypen zu sein. Sie können möglicherweise nicht eine Methode auf IFoo<Banana> haben, die eine Banane zurückgibt, weil es tatsächlich eine Implementierung von IFoo<Giraffe> sein könnte; Wie würde der Autor der Implementierung kennen eine Banane auszuteilen? Sie können möglicherweise nicht eine Methode auf IFoo<Banana> haben, die eine Banane aus dem gleichen Grund nimmt; die Implementierer von IFoo<Giraffe> erwartet Sie ihm eine Giraffe Hand.

Hier ist eine andere Art und Weise, es zu betrachten:

  • "in T" bedeutet (in etwa) "T erscheint nur in Eingabepositionen".
  • "out T" bedeutet (in etwa) "T erscheint nur in Ausgangspositionen".

Deshalb "in out T" würde bedeuten, ... was? Wie wir bereits gesehen haben, kann es nur bedeuten, „T nicht in jeder Methode oder Eigenschaft angezeigt wird.“ Was ist der Punkt, eine generische Art in T zu machen, wo man nie T verwenden?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top