W3C исключил такой селектор из-за огромного влияния производительности на браузер.
ToList()
возвращает новый экземпляр, поэтому вы не можете увидеть результат AddRange в «gc». Если вы действительно хотите использовать AddRange, вы можете сделать следующее.
((List<GenericClass>)gc).AddRange(sampleList);
Метод AddRange()
работает нормально. Проблема в том, что вы не читали документацию по методу расширения ToList()
внимательно, и поэтому не понимаете, что метод ToList()
возвращает совершенно новый объект .
Из документации :
Создает список < T> из IEnumerable < T>.
blockquote>Поскольку объект, с которым вы вызываете
AddRange()
, на самом деле не является исходной коллекцией, исходная коллекция остается неизменной.В некотором смысле, ваш вопрос
List<T>
эквивалентен очень распространенному вопросу «почемуstring.Replace()
не работает?»В приведенном вами примере, на самом деле не намного лучше решение, чем просто не скрывая
List<T>
в первую очередь. Вы можете, поскольку вы используете общий интерфейсICollection<T>
, написать свой собственныйAddRange()
в качестве метода расширения:public static void AddRange<T>(this ICollection<T> collection, IEnumerable<T> range) { foreach (T t in range) { collection.Add(t); } }
Но я не уверен, что это действительно намного лучше, чем просто оставить введите как
List<T>
, если цель состоит в том, чтобы иметь возможность изменять объект и использовать методAddRange()
.Бросить ссылку
ICollection<T>
обратно к ее основномуList<T>
(как предлагает другой ответчик) бессмысленно, так как это сведет на нет любое значение при использовании интерфейсаICollection<T>
в первую очередь.Просто оставьте ссылку как
List<T>
, по крайней мере, в любом контексте, где вам действительно нужно изменить коллекцию. (Хорошо, и даже, возможно, полезно, раскрыть этот список в других контекстах, используя толькоICollection<T>
, но это совершенно другое обсуждение.)Пока я отвечаю, я буду упоминать, что я Скептически относимся к тому, что вы правильно поняли цель предупреждения FxCop, поскольку раскрытие общих списков само по себе не является вредным.