Подтвердить что ты не робот

Невозможно преобразовать HashSet в IReadOnlyCollection

У меня есть HashSet, и я пытаюсь передать его в IReadOnlyCollection, но я получаю ошибку:

Невозможно неявно преобразовать тип "System.Collections.Generic.HashSet" в "System.Collections.Generic.IReadOnlyCollection". Явное преобразование существует (вам не хватает роли?)

Hashset - это

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

Я могу использовать явный приведение, но я не знаю, почему я не могу просто использовать его как 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

Почему я не могу использовать его без явного приведения?

Я использую.NET framework 4.5

4b9b3361

Ответ 1

Вы используете 4.5 и Hashset не реализует IReadOnlyCollection до 4.6

Из MSDN:

HashSet реализует интерфейс IReadOnlyCollection, начиная с.NET Framework 4.6; в предыдущих версиях.NET Framework класс HashSet не реализовал этот интерфейс.

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

Ответ 2

Это связано с тем, что в.NET 4.5 HashSet<T> не реализует IReadOnlyCollection<T>. В.NET 4.6 это выполняется, поэтому неявное выполнение работает, как и ожидалось.

BTW, явное внесение в ваш фрагмент кода компилируется, но он не будет работать во время выполнения. Он компилируется, потому что set переменная имеет тип HashSet<DateTime>, а поскольку HashSet<DateTime> не запечатан, могут существовать подклассы, реализующие интерфейс.