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
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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With