=============
UPDATE: Ich habe diese Antwort als Grundlage für diesen Blogeintrag verwendet:
Warum erlauben ref- und out-Parameter keine Typvariation?
Weitere Kommentare zu diesem Thema finden Sie auf der Blog-Seite. Danke für die tolle Frage.
=============
Nehmen wir an , Sie haben Klassen Animal, Mammal, Reptile, Giraffe, Turtleund Tiger, mit den offensichtlichen Subklassifizieren Beziehungen.
Angenommen, Sie haben eine Methode void M(ref Mammal m). Mkann sowohl lesen als auch schreiben m.
Können Sie eine Variable vom Typ passieren Animalzu M?
Nein. Diese Variable könnte a enthalten Turtle, geht jedoch Mdavon aus, dass sie nur Säugetiere enthält. A Turtleist nicht a Mammal.
Schlussfolgerung 1 : refParameter können nicht "größer" gemacht werden. (Es gibt mehr Tiere als Säugetiere, daher wird die Variable "größer", weil sie mehr Dinge enthalten kann.)
Können Sie eine Variable vom Typ passieren Giraffezu M?
Nein Mkann schreiben m, und Mvielleicht einen schreiben wollen Tigerin m. Jetzt haben Sie ein Tigerin eine Variable eingefügt, die tatsächlich vom Typ ist Giraffe.
Schlussfolgerung 2 : refParameter können nicht "kleiner" gemacht werden.
Nun überlegen Sie N(out Mammal n).
Können Sie eine Variable vom Typ passieren Giraffezu N?
Nein, Nkann schreiben nund Nmöchte vielleicht eine schreiben Tiger.
Schlussfolgerung 3 : outParameter können nicht "kleiner" gemacht werden.
Können Sie eine Variable vom Typ passieren Animalzu N?
Hmm.
Gut, warum nicht? Nkann nicht lesen n, es kann nur darauf schreiben, oder? Du schreibst eine Tigerin eine Variable vom Typ Animalund bist fertig, oder?
Falsch. Die Regel lautet nicht " Nkann nur schreiben n".
Die Regeln sind kurz:
1) Nmuss schreiben, nbevor Nnormal zurückgegeben wird. (Bei NWürfen sind alle Wetten ungültig.)
2) Nmuss etwas schreiben, nbevor es etwas liest n.
Das erlaubt diese Abfolge von Ereignissen:
- Deklarieren Sie ein Feld
xvom Typ Animal.
- Übergeben Sie
xals outParameter N.
Nschreibt ein Tigerin n, was ein Alias für ist x.
- In einem anderen Thread schreibt jemand ein
Turtlein x.
Nversucht, den Inhalt von zu lesen n, und entdeckt Turtleeine Variable, die seiner Meinung nach vom Typ ist Mammal.
Natürlich wollen wir das illegal machen.
Schlussfolgerung 4 : outParameter können nicht "größer" gemacht werden.
Endgültige Schlussfolgerung : Weder refnoch outParameter dürfen ihre Typen variieren. Andernfalls wird die überprüfbare Typensicherheit verletzt.
Wenn Sie diese Probleme in der grundlegenden Typentheorie interessieren, lesen Sie meine Reihe darüber, wie Kovarianz und Kontravarianz in C # 4.0 funktionieren .