Активный вызов:
enumerable.Cast<T>();
эквивалентен:
enumerable.Select(x=>(T)x)
И:
enumerable.ToList<T>()
эквивалентен:
List<T> myList = new List<T>();
foreach(T item in enumerable)
{
myList.Add(item);
}
so ...
enumerable.Cast<T2>.ToList()
эквивалентно:
List<T2> myList = new List<T2>();
foreach(T item in enumerable)
{
myList.Add((T2)item);
}
Оба из них будут быстро взорваны, если перечислимый содержит какие-либо записи, не относящиеся к типу, приведенному к T2.
Было бы безопаснее, как
enumerable.Where(x=>x is T2).Cast<T2>().ToList();
или
enumerable.OfType<T2>().ToList();
Однако ни один из этих объектов не копирует объекты, содержащиеся в исходной коллекции.Они просто создают коллекции, содержащие ссылки на оригинальные объекты.