2015-01-29 7 views
5

Die Frage scheint einfach. Obwohl die documentation sagt, es tut:Funktioniert `Dictionary <TKey, TValue> .KeyCollection`` IReadOnlyCollection` oder nicht?

public sealed class KeyCollection : ICollection<TKey>, 
    IReadOnlyCollection<TKey>, IEnumerable<TKey>, ICollection, IEnumerable 

der folgende Code einen Fehler gibt:

class MyKeys<T> 
{ 
    readonly Dictionary<T, T> dict = new Dictionary<T, T>(); 
    public IReadOnlyCollection<T> Keys { get { return dict.Keys; } set; } 
} 

sagen, dass es keine Umwandlung KeyCollection<T>-IReadOnlyCollection<T> ist.

Außerdem polish documentation (französisch auch für diese Angelegenheit), sagt es nicht:

[SerializableAttribute] 
public sealed class KeyCollection : ICollection<TKey>, 
    IEnumerable<TKey>, ICollection, IEnumerable 

Welche ist es?

Und für den Fall ist es der Fehler in Englisch Dokumentation, eine Bonus-Frage:

Gibt es eine Möglichkeit Keys als Nur-Lese-Sammlung zu bekommen?

+0

Während es nicht implementiert 'IReadOnlyCollection ' es, dass nur gelesen wird 'IsReadOnly' gibt true zurück, und 'Add',' Remove' und 'Clear' alle werfen Ausnahmen. – juharr

Antwort

5

Dictionary.KeyCollection derzeit nicht IReadOnlyCollection implementieren.

Jedoch, die Schnittstelle wurde der nächsten Version von .Net (v4.6) hinzugefügt. Sie können das mit VS 2015 Vorschau sehen.

Sie können auch, dass in this announcement sehen (lädt eine Excel mit allen Änderungen für v4.6-Datei)

+1

Oh, also vielleicht ist die englische Dokumentation aktuell. – luk32

+1

@ luk32 Wenn Sie die Version von 4.5 zu etwas niedrigerem ändern, zeigt es, dass es 'IReadOnlyCollection' nicht implementiert – juharr

+0

@ luk32 Ich wäre wirklich nicht überrascht, wenn das der Fall ist (aus Versehen) – i3arnon

5

Zum Zeitpunkt des Schreibens dieses die reference source antwortete nicht die IReadOnlyCollection interfact Implementierung enthalten:

public sealed class KeyCollection: ICollection<TKey>, ICollection 

Seitdem hat sich die Referenzquelle jetzt aktualisiert worden sind: die IReadOnlyCollection Schnittstelle.

public sealed class KeyCollection: ICollection<TKey>, ICollection, IReadOnlyCollection<TKey> 
+0

Bitte beachten Sie, dass der Link der Referenzquelle oben auf den aktualisierten .NET-Code verweist, in dem KeyCollection DOES von IReadOnlyCollection ableitet. –

+0

Danke. Ich habe die Antwort aktualisiert, um anzuzeigen, dass die Referenzquelle nun über die Schnittstelle verfügt. –

1

Sie beziehen sich auf die Dokumentation für .Net Framework 4.5. Wo es hinzugefügt wird. Die source code hat

public sealed class KeyCollection: ICollection<TKey>, ICollection 

Wenn Sie am documentation for .Net framework 4.0 schauen dann hat:

public sealed class KeyCollection : ICollection<TKey>, 
    IEnumerable<TKey>, ICollection, IEnumerable 

Wo ICollection<TKey>implementsIEnumerable<T> und ICollectionIEnumerable implementiert, so dass keine IReadOnlyCollection<TKey> umgesetzt wird.

Is there a way to get Keys as read-only collection?

können Sie tun:

ReadOnlyCollection<int> readonlyKeys = new ReadOnlyCollection<int>(dictionary.Keys.ToList()); 
+0

Ich würde sagen, es ist * eine Kopie * von 'Keys' als eine schreibgeschützte Sammlung, nicht die ursprünglichen' Keys' eingewickelt oder gegossen. Der ursprüngliche Container wird kopiert. Liege ich falsch? – luk32

+0

@ luk32, ja du hast Recht. Wenn Sie Visual Studio 2015 verwenden und die .Net-Framework-Version .NET 4.6 angeben, können Sie 'IReadOnlyCollection Keys = dictionary.Keys;' – Habib

+0

Für zukünftige Leser beachten Sie bitte, dass der Link zum .NET-Quellcode in der Antwort oben verweist auf die aktualisierte Version (4.6), die von IReadOnlyCollection abgeleitet wird, aber die .NET 4.5-Version enthielt ursprünglich es nicht. –

Verwandte Themen