Это не копирует список. Вместо этого сборка readonly хранит ссылку на исходный список и запрещает ее изменение. Однако, если вы измените базовый список через names, тогда также изменится readOnlyNames, поэтому лучше всего отбросить записываемый экземпляр, если сможете.
Ответ 3
var readonlyCollection = new ReadOnlyCollection<string>(list);
var myreadonlycollection = new ReadOnlyCollection<string>(listname);
Ответ 5
Другие ответы верны в том, что вам нужно передать 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());
}