Метод AddRange()
работает нормально.Проблема в том, что вы не внимательно прочитали документацию по методу расширения ToList()
и поэтому не понимаете, что метод ToList()
возвращает совершенно новый объект .
Из документации :
Создает список из IEnumerable .
Поскольку объект, который вы вызываете 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, поскольку раскрытие общих списков само по себе не является вредным.