Ответ 1
Использование роли
Преимущество Cast
происходит, когда ваша коллекция реализует только IEnumerable
(т.е. не общую версию). В этом случае Cast
преобразует все элементы в TResult
путем кастинга и возвращает IEnumerable<TResult>
. Это удобно, потому что все другие методы расширения LINQ (включая Select
) объявляются только для IEnumerable<T>
. В коде это выглядит так:
IEnumerable source = // getting IEnumerable from somewhere
// Compile error, because Select is not defined for IEnumerable.
var results = source.Select(x => ((string)x).ToLower());
// This works, because Cast returns IEnumerable<string>
var results = source.Cast<string>().Select(x => x.ToLower());
Cast
и OfType
- это только два метода расширения LINQ, которые определены для IEnumerable
. OfType
работает как Cast
, но пропускает элементы, которые не относятся к типу TResult
, а не выбрасывают исключение.
Влияния и неявные преобразования
Причина, по которой ваш оператор неявного преобразования не работает, когда вы используете Cast
, прост: Cast
casts object
to TResult
- и ваше преобразование не определено для object
, только для вашего конкретного типа, Реализация для Cast
выглядит примерно так:
foreach (object obj in source)
yield return (TResult) obj;
Этот "отказ" приведения, выполняемый преобразованием, соответствует основным правилам преобразования - как видно из этого примера:
YourType x = new YourType(); // assume YourType defines an implicit conversion to string
object o = x;
string bar = (string)x; // Works, the implicit operator is hit.
string foo = (string)o; // Fails, no implicit conversion between object and string