Der Grund dieser Code ist aufgrund der Tatsache arbeitet, dass die Enumerator
die Sammlung nicht ändern können:Warum ist Kovarianz mit ReadOnlyCollection nicht erlaubt?
var roList = new List<string>() { "One", "Two", "Three" };
IEnumerable<object> objEnum = roList;
Wenn wir versuchen, die gleiche Sache mit einem List<object>
zu tun, statt IEnumerable<object>
, würden wir einen Compiler-Fehler erzählt bekommen uns, dass wir nicht implizit Typ List<string>
zu List<object>
konvertieren können. In Ordnung, das macht Sinn und es war eine gute Entscheidung von Microsoft, meiner Meinung nach eine Lektion aus Arrays.
Was ich jedoch nicht herausfinden kann ist, warum in der Welt ist diese Hardline-Regel auf etwas wie ReadOnlyCollection
anwendbar? Wir sind nicht in der Lage, die Elemente in ReadOnlyCollection
zu ändern. Was ist also das Sicherheitsrisiko, das dazu geführt hat, dass Microsoft uns daran gehindert hat, Kovarianz mit schreibgeschütztem Code zu verwenden? Gibt es eine Möglichkeit, diesen Sammlertyp zu ändern, für den Microsoft beispielsweise durch Zeiger verantwortlich ist?
"eine Lektion gelernt von Arrays": in Bezug auf Array Kovarianz, das war eigentlich eine bewusste Design-Entscheidung, es zu erlauben, weil Java es hatte. Es stellte sich heraus, dass es eine ziemlich schlechte Idee war ... http://blogs.msdn.com/b/ericlippert/archive/2007/10/17/covariance-and-contravariance-in-c-part-two-array- covariance.aspx –
@ThomasLevesque Gut gelesen, danke. –