Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot convert HashSet to IReadOnlyCollection

Tags:

c#

.net

I have a HashSet and I am trying to cast it into IReadOnlyCollection, but I am getting error:

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

Hashset is a

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

I can use explicit cast, but I don't know the reason why I can't just use it as 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

Why can't I use it without an explicit cast?

I am using .NET framework 4.5

like image 614
jahav Avatar asked Sep 24 '15 13:09

jahav


2 Answers

You're using 4.5 and Hashset doesn't implement IReadOnlyCollection until 4.6

From 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

like image 64
rmn36 Avatar answered Oct 15 '22 02:10

rmn36


This is because in .NET 4.5, HashSet<T> doesn't implement IReadOnlyCollection<T>. In .NET 4.6, it does, so the implicit cast works as expected.

BTW, the explicit cast in your code snippet compiles, but it will fail at runtime. It compiles because the set variable is of type HashSet<DateTime>, and since HashSet<DateTime> is not sealed, there might be subclasses that implement the interface.

like image 12
Thomas Levesque Avatar answered Oct 15 '22 02:10

Thomas Levesque