2

Warum werden verschiedene Auflistungen (die alle die IReadOnlyCollection-Schnittstelle implementieren) vom Compiler unterschiedlich gehandhabt, wenn versucht wird, sie in IReadOnlyCollection umzuwandeln?implizite/explizite Umwandlung von Umwandlungen auf IReadOnlyCollection

IReadOnlyCollection<int> a = new List<int>();  // everything fine 
IReadOnlyCollection<int> b = new HashSet<int>(); // compiler wants me to cast 
IReadOnlyCollection<int> c = new Stack<int>();  // compiler wants me to cast 
IReadOnlyCollection<int> d = new Queue<int>();  // compiler wants me to cast 
IReadOnlyCollection<int> e = new LinkedList<int>(); // compiler wants me to cast 
IReadOnlyCollection<int> f = new SortedSet<int>(); // compiler wants me to cast 

ich .NET 4.5 und Visual Studio 2015 mit

Der Compiler-Fehler in den oben genannten Fällen ist dies:

Typ Queue<int>/Stack<int>/... kann nicht implizit in IReadOnlyCollection<int> umgewandelt werden . Eine explizite Konvertierung existiert. Vermissen Sie eine Besetzung?

(Dies ist nicht der eigentliche Text, aber ich glaube, Sie würden mich nicht wollen hier einen deutschen Text kopieren und einfügen.)

Wenn ich die Besetzung von

IReadOnlyCollection<int> d = new Queue<int>() as IReadOnlyCollection<int>; 

oder sogar von

IReadOnlyCollection<int> d = (IReadOnlyCollection<int>)new Queue<int>(); 

alles ist gut; es gibt mir keine Kompilierungs- oder Laufzeitfehler.

+0

IReadOnlyCollection existiert seit .NET 4.5, soweit ich weiß. – Kjara

+0

'List' ist eine allgemeine Klasse; aber zum Beispiel 'LinkedList' ist eine Unterklasse für die List-Klasse. Vielleicht geht es um Erbschaftsangelegenheiten, aber ich möchte diese Antwort auch lernen. – pilkington

+0

Ich kann das auch nicht reproduzieren - vielleicht als ein Hinweis auf uns, können Sie uns sagen, was der Compiler speziell als Fehler oder Warnung sagt? –

Antwort

2

Wenn Sie .NET 4.6 oder höher als Ziel verwenden, wird dies kompiliert.

An dieser Version SortedSet (zum Beispiel) die IReadOnlyCollection (markiert durch einen Rechtsklick und Auswahl von „Gehe zu Definition) nicht implementiert

Die vollständige Liste ist.

ISet < T>, ICollection < T>, IEnumerable < T>, IEnumerable, ICollection, ISerializable, IDeserializationCallback, IReadOnlyCollection < T>

bei 4,5 nur implementiert:

ISet < T>, ICollection < T>, IEnumerable < T>, ICollection, IEnumerable, ISerializable, IDeserializationCallback

Wenn die Dokumentation etwas anderes sagt, dann (I habe Angst) die Dokumentation ist falsch.