Ich habe gelernt, dass HashSet
die IEnumerable
Schnittstelle implementiert. Somit ist es möglich, ein HashSet
Objekt in IEnumerable
implizit zu Stimmen:C# -Typ-Konvertierung: Explizite Umwandlung existiert, aber ein Konvertierungsfehler?
HashSet<T> foo = new HashSet<T>();
IEnumerable<T> foo2 = foo; // Implicit cast, everything fine.
Diese für verschachtelte generische Typen funktioniert auch:
HashSet<HashSet<T>> dong = new HashSet<HashSet<T>>();
IEnumerable<IEnumerable<T>> dong2 = dong; // Implicit cast, everything fine.
Zumindest ist das, was ich dachte. Aber wenn ich ein Dictionary
machen, ich laufe in ein Problem:
IDictionary<T, HashSet<T>> bar = new Dictionary<T, HashSet<T>>();
IDictionary<T, IEnumerable<T>> bar2 = bar; // compile error
Die letzte Zeile gibt mir die folgenden Compiler-Fehler (Visual Studio 2015):
kann nicht implizit Typen umwandeln
System.Collections.Generic.IDictionary<T, System.Collections.Generic.HashSet<T>>
zuSystem.Collections.Generic.IDictionary<T, System.Collections.Generic.IEnumerable<T>>
.Eine explizite Konvertierung vorhanden ist (möglicherweise fehlt eine Guss?)
Aber wenn ich die Besetzung zu tun, indem er
IDictionary<T, IEnumerable<T>> bar2 = (IDictionary<T, IEnumerable<T>>) bar;
dann bekomme ich eine ungültige Guss Ausnahme zur Laufzeit.
Zwei Fragen:
- Wie das ich lösen? Ist der einzige Weg, um über die Schlüssel zu iterieren und ein neues Wörterbuch Stück für Stück aufzubauen?
- Warum bekomme ich dieses Problem an erster Stelle, obwohl
HashSet
die SchnittstelleIEnumerable
implementiert?
'IEnumerable' ist [covariant] (https://msdn.microsoft.com/en-gb/library/mt654060.aspx). 'IDictionary ' ist nicht. Es sind die * äußeren * Typen, wo dies wichtig ist –