Причины этот код работает, в связи с тем, что Enumerator
не может изменять коллекцию:Почему ковариация не допускается с помощью ReadOnlyCollection?
var roList = new List<string>() { "One", "Two", "Three" };
IEnumerable<object> objEnum = roList;
Если попытаться сделать то же самое с List<object>
, вместо IEnumerable<object>
, мы получим, говорящие об ошибке компилятора что мы не можем неявно преобразовывать тип List<string>
в List<object>
. Хорошо, это имеет смысл, и это было хорошим решением Microsoft, на мой взгляд, как урока, извлеченного из массивов.
Однако, что я не могу понять, почему в мире это правило жесткой нормы применимо к чему-то вроде ReadOnlyCollection
? Мы не сможем изменить элементы в ReadOnlyCollection
, так что же касается безопасности, которая заставила Microsoft помешать нам использовать ковариацию с чем-то, что доступно только для чтения? Есть ли способ изменения такого типа коллекций, который Microsoft пытается учесть, например, с помощью указателей?
«Урок, извлеченный из массивов»: в отношении ковариации массива это было фактически сознательное дизайнерское решение, позволяющее ему, потому что у него это было. Это оказалось неплохой идеей ... http://blogs.msdn.com/b/ericlippert/archive/2007/10/17/covariance-and-contravariance-in-c-part-two-array- covariance.aspx –
@ThomasLevesque Хорошо читайте, спасибо. –