Ответ 1
Вы можете создать новый экземпляр, используя существующий список в конструкторе.
var readOnlyList = new ReadOnlyCollection<string>(existingList);
Я хочу преобразовать элементы, введенные в список строк, чтобы:
System.Collections.ObjectModel.ReadOnlyCollection<string>
Я попытался использовать:
(System.Collections.ObjectModel.ReadOnlyCollection<string>)listname
Но он возвращает ошибку.
Вы можете создать новый экземпляр, используя существующий список в конструкторе.
var readOnlyList = new ReadOnlyCollection<string>(existingList);
Если у вас есть:
List<string> names=new List<string>(){"Rod", "Jane", "Freddy"};
Затем вы можете сказать:
ReadOnlyCollection<string> readOnlyNames=names.AsReadOnly();
Это не копирует список. Вместо этого сборка readonly хранит ссылку на исходный список и запрещает ее изменение. Однако, если вы измените базовый список через names
, тогда также изменится readOnlyNames
, поэтому лучше всего отбросить записываемый экземпляр, если сможете.
var readonlyCollection = new ReadOnlyCollection<string>(list);
Конструктор ReadOnlyCollection принимает IList
Вот ссылка http://msdn.microsoft.com/en-us/library/ms132476.aspx
var myreadonlycollection = new ReadOnlyCollection<string>(listname);
Другие ответы верны в том, что вам нужно передать IList<T>
в конструктор ReadOnlyCollection<T>
.
Мне полезно иметь метод расширения на IEnumerable<T>
, который облегчает создание ReadOnlyCollection<T>
:
public static ReadOnlyCollection<T> ToReadOnlyCollection<T>(
this IEnumerable<T> source)
{
if (source == null) throw new ArgumentNullException("source");
return new ReadOnlyCollection<T>(
source as IList<T> ?? source.ToList());
}