2

Почему разные коллекции (которые все реализуют интерфейс IReadOnlyCollection) обрабатываются по-разному компилятором при попытке превратить их в IReadOnlyCollection?Неявная/явная путаница при запуске на IReadOnlyCollection

IReadOnlyCollection<int> a = new List<int>();  // everything fine 
IReadOnlyCollection<int> b = new HashSet<int>(); // compiler wants me to cast 
IReadOnlyCollection<int> c = new Stack<int>();  // compiler wants me to cast 
IReadOnlyCollection<int> d = new Queue<int>();  // compiler wants me to cast 
IReadOnlyCollection<int> e = new LinkedList<int>(); // compiler wants me to cast 
IReadOnlyCollection<int> f = new SortedSet<int>(); // compiler wants me to cast 

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

Ошибка компилятора в приведенных выше случаях заключается в следующем:

Тип Queue<int>/Stack<int>/... не может быть неявно преобразован в IReadOnlyCollection<int> , Существует явное преобразование. Вам не хватает роли?

(Это не сам текст, но я верю, что вы не хотели бы, чтобы я скопировать и вставить в текст на немецком языке здесь.)

Если я делаю бросок по

IReadOnlyCollection<int> d = new Queue<int>() as IReadOnlyCollection<int>; 

или даже от

IReadOnlyCollection<int> d = (IReadOnlyCollection<int>)new Queue<int>(); 

все в порядке; он не дает мне компиляции или ошибок во время выполнения.

+0

IReadOnlyCollection существует с .NET 4.5, насколько я знаю. – Kjara

+0

«Список» - это общий класс; но, например, 'LinkedList' является подклассом для класса List. Это может быть проблема с наследованием, но я тоже хочу узнать этот ответ. – pilkington

+0

Я тоже не могу воспроизвести это - возможно, как один ключ к нам, можете ли вы рассказать нам, что конкретно говорит компилятор как ошибка или предупреждение? –

ответ

2

Если вы нацелились на .NET 4.6 или выше, это скомпилируется.

В этой версии SortedSet (например) действительно осуществляет IReadOnlyCollection (проверяется правой кнопкой мыши и выбрав пункт «Go To Definition)

Полный список:.

ISet < T>, ICollection < Т>, IEnumerable < Т>, IEnumerable, ICollection, ISerializable, IDeserializationCallback, IReadOnlyCollection < Т>

на 4.5 она реализует только:

ISet < T>, ICollection < T>, IEnumerable < T>, ICollection, IEnumerable, ISerializable, IDeserializationCallback

Если документация говорит иначе, то (я Боюсь, документация неверна.

Смежные вопросы