Пожалуйста, прочитайте до конца, прежде чем принимать решение о голосовании как дубликат...
У меня есть тип, который реализует оператор implicit cast
для другого типа:
class A
{
private B b;
public static implicit operator B(A a) { return a.b; }
}
class B
{
}
Теперь неявное и явное кастинг просто отлично:
B b = a;
B b2 = (B)a;
... так как же Linq .Cast<>
нет?
A[] aa = new A[]{...};
var bb = aa.Cast<B>(); //throws InvalidCastException
Глядя на исходный код для .Cast<>
, магии не происходит: несколько особых случаев, если параметр действительно является IEnumerable<B>
, а затем:
foreach (object obj in source)
yield return (T)obj;
// ^^ this looks quite similar to the above B b2 = (B)a;
Итак, почему мой явный литье работает, но не внутри .Cast<>
?
Скомпилирует ли компилятор мой явный листинг?
PS. Я видел этот вопрос, но я не думаю, что его ответы действительно объясняют, что происходит.