Почему разные коллекции (которые все реализуют интерфейс 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>();
все в порядке; он не дает мне компиляции или ошибок во время выполнения.
IReadOnlyCollection существует с .NET 4.5, насколько я знаю. – Kjara
«Список» - это общий класс; но, например, 'LinkedList' является подклассом для класса List. Это может быть проблема с наследованием, но я тоже хочу узнать этот ответ. – pilkington
Я тоже не могу воспроизвести это - возможно, как один ключ к нам, можете ли вы рассказать нам, что конкретно говорит компилятор как ошибка или предупреждение? –