Невозможно преобразовать 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
Ответы
Ответ 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>
не запечатан, могут существовать подклассы, реализующие интерфейс.