Это сделано специально для включения сценария «список копирования».
Например, если я сделаю foreach( var a in list ) list.Remove(a)
, я получу исключение, говорящее, что «коллекция была изменена», в то время какПеречисление было в процессе.
Чтобы это исправить, я делаю: foreach( var a in list.ToList() ) list.Remove(a)
.
Если вы хотите семантику в духе «преобразовать в список, если она еще не одна», выПридется справиться самому.Фактически, вы могли бы написать для этого аккуратный метод расширения:
public static IList<T> ToListIfNotAlready( this IEnumerable<T> source )
{
var list = source as IList<T>;
return list == null ? source.ToList() : list;
}
Да, могло быть и наоборот, но разработчики LINQ выбрали этот подход и имели полное право сделать это,поскольку ни один из подходов не имеет явного преимущества в общем случае.