Причина в том, что функция Cast
написана против универсальных типов (то есть не конкретных типов).Это выглядит примерно так:
public IEnumeralbe<T> Cast<T>(this IEnumerable source) {
foreach (object cur in source) {
yield return (T)cur;
}
}
Операция приведения внутри Cast
может быть выполнена только на этой общей информации, которая не включает в себя специальный оператор приведения к Foo
.Следовательно, этот код не учитывает неявное преобразование здесь, и вместо этого по существу полагается только на преобразования CLR.
Чтобы получить эту работу, необходимо выполнить приведение к типу Foo
непосредственно.Лучший способ сделать это с помощью выбора
var fooList = intList.Select(x => (Foo)x).ToList();