2015-09-24 15 views
16

Ho un HashSet e sto cercando di gettare in IReadOnlyCollection, ma sto ottenendo errore:Impossibile convertire HashSet a IReadOnlyCollection

Cannot implicitly convert type 'System.Collections.Generic.HashSet' to 'System.Collections.Generic.IReadOnlyCollection'. An explicit conversion exists (are you missing a cast?)

HashSet è un

public class HashSet<T> : ICollection<T>, ISerializable, IDeserializationCallback, ISet<T>, IReadOnlyCollection<T> 

posso usare cast esplicito , ma non conosco il motivo per cui non posso semplicemente usarlo come IReadOnlyCollection.

HashSet<DateTime> set = new HashSet<DateTime> { DateTime.Today }; 
ICollection<DateTime> collection = set; // OK 
ISerializable serializable = set;  // OK 
IDeserializationCallback deserializationCallback = set; // OK 
ISet<DateTime> iSet = set;        // OK 
IReadOnlyCollection<DateTime> castReadOnlyCollection = (IReadOnlyCollection<DateTime>)set; // OK 
IReadOnlyCollection<DateTime> readOnlyCollection = set; // Error 

Perché non posso usarlo senza un cast esplicito?

Sto usando .NET Framework 4.5

+0

E a quanto pare non ha sempre implementare tale interfaccia http: // StackOverflow .com/questions/11849861/why-hashsett-does-not-implement-ireadonlycollectiont – juharr

+0

È stato aggiunto oops in .NET 4.5, indotto da IReadOnlyCollection <> per supportare la proiezione del linguaggio WinRT e WinRT non ha un equivalente di un set. È stato risolto in 4.5.1, è sufficiente modificare l'obiettivo quadro del progetto come soluzione alternativa. –

risposta

24

Stai usando 4,5 e HashSet non implementa IReadOnlyCollection fino 4,6

Da MSDN:

HashSet implements the IReadOnlyCollection interface starting with the .NET Framework 4.6; in previous versions of the .NET Framework, the HashSet class did not implement this interface.

https://msdn.microsoft.com/en-us/library/bb359438(v=vs.110).aspx

+6

Nella parte superiore della pagina si dice ".NET Framework 4.6 e 4.5", quindi non mi aspettavo modifiche nell'API. Non è questo il caso, buono a sapersi. Grazie. – jahav

+3

Così è il mondo della documentazione. Alcuni sono migliori di altri, ma tutti avranno inevitabilmente le loro inesattezze, sfortunatamente. – rmn36

12

Questo perché in .NET 4.5, HashSet<T> non implementa IReadOnlyCollection<T>. In .NET 4.6, lo fa, quindi il cast implicito funziona come previsto.

BTW, il cast esplicito nello snippet di codice viene compilato, ma non funzionerà in fase di esecuzione. Si compila perché la variabile set è di tipo HashSet<DateTime> e poiché HashSet<DateTime> non è sigillata, potrebbero esserci sottoclassi che implementano l'interfaccia.

+0

Grazie, probabilmente ho un altro problema strano lì. Progetto afferma Framework 4.5, ma il test R # con cast ha esito positivo (i test unitari dovrebbero utilizzare la piattaforma target di un progetto). – jahav

Problemi correlati