Ответ 1
Имя Enumerable.Cast
вводит в заблуждение, поскольку его целью является удаление значений. Он работает на IEnumerable
(не на IEnumerable<T>
), чтобы создать IEnumerable<T>
. Если у вас уже есть IEnumerable<T>
Enumerable.Cast
, скорее всего, не метод, который вы хотите использовать.
Технически, он делает что-то вроде этого:
foreach(object obj in value)
yield return (T)obj;
Если T
- это нечто иное, чем значение в коробке, это приведет к InvalidCastException
.
Вы можете проверить это поведение самостоятельно:
int i = 0;
object o = i;
double d1 = (double)i; // Works.
double d2 = (double)o; // Throws InvalidCastException
У вас есть два возможных решения:
- Используйте
Select(x => (B)x)
- Создайте метод расширения
Cast
, который работает наIEnumerable<T>
, а не наIEnumerable
.