2015-01-29 14 views
5

La domanda sembra semplice. Anche se il documentation dice che fa:Does `Dizionario <TKey, TValue> .KeyCollection` implementa` IReadOnlyCollection` o no?

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

il seguente codice dà un errore:

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

dicendo che non v'è alcuna conversione KeyCollection<T>-IReadOnlyCollection<T>.

Inoltre polish documentation (francese anche per questo) dice che non lo fa:

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

Che è?

E nel caso in cui è l'errore nella documentazione inglese, una domanda bonus:

C'è un modo per ottenere Keys in sola lettura collezione?

+0

Anche se non implementa '' IReadOnlyCollection si legge solo in quel 'IsReadOnly' restituisce true e 'Aggiungi',' Rimuovi' e 'Cancella' generano tutte le eccezioni. – juharr

risposta

5

Dictionary.KeyCollection attualmente non implementare IReadOnlyCollection.

Tuttavia,, l'interfaccia è stata aggiunta alla prossima versione di .Net (v4.6). Lo puoi vedere usando l'anteprima di VS 2015.

Si può anche vedere che in this announcement (scarica un file Excel con tutte le modifiche per v4.6)

+1

Oh, quindi forse la documentazione inglese è aggiornata al futuro. – luk32

+1

@ luk32 Se cambi la versione da 4.5 a qualsiasi valore inferiore mostra che non implementa 'IReadOnlyCollection' – juharr

+0

@ luk32 In realtà non sarei sorpreso se questo fosse il caso (per errore) – i3arnon

5

Al momento della stesura di questo risponde alla reference source non conteneva le IReadOnlyCollection interfact realizzazione:

public sealed class KeyCollection: ICollection<TKey>, ICollection 

Da allora, la fonte di riferimento è stato aggiornato per ora includono l'interfaccia IReadOnlyCollection.

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

Si noti che il collegamento sorgente di riferimento sopra ora fa riferimento al codice .NET aggiornato in cui KeyCollection deriva da IReadOnlyCollection . –

+0

Grazie. Ho aggiornato la risposta per riflettere che la fonte di riferimento ora ha l'interfaccia. –

1

Si fa riferimento alla documentazione per .Net framework 4.5. Dove è aggiunto. Il source code ha

public sealed class KeyCollection: ICollection<TKey>, ICollection 

Se si guardano le documentation for .Net framework 4.0 allora è:

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

Dove ICollection<TKey>implementsIEnumerable<T> e ICollection implementa IEnumerable, in modo che nessun IReadOnlyCollection<TKey> è implementato.

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

Si può fare:

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

Direi che è * una copia * di 'Keys' come una raccolta di sola lettura, non l'originale' Keys' avvolto o cast. Il contenitore originale verrà copiato. Ho sbagliato? – luk32

+0

@ luk32, sì hai ragione. Se si utilizza Visual Studio 2015 e si specifica la versione di .NET Framework .Net 4.6, è possibile eseguire 'IReadOnlyCollection Keys = dictionary.Keys;' – Habib

+0

Per qualsiasi futuro lettore, si noti che il collegamento al codice sorgente .NET nella risposta sopra punti alla versione aggiornata (4.6) che deriva da IReadOnlyCollection , ma la versione .NET 4.5 non la includeva originariamente. –

Problemi correlati