Это очень странно! Здесь есть сообщение в блоге здесь , в котором описывается, как изменилось поведение Cast
между .NET 3.5 и .NET 3.5 SP1, но оно по-прежнему не объясняет InvalidCastException, которое вы даже получаете, если переписываете ваш код таким образом:
var list = new[] { 1 };
var castedList = from long l in list select l;
Console.WriteLine(castedList.First());
Очевидно, вы можете обойти это, сделав бросок самостоятельно
var castedList = list.Select(i => (long)i);
Это работает, но это не объясняет ошибку в первую очередь , Я попытался сделать список коротким и плавающим, и те бросили то же исключение.
Изменить
В этом сообщении в блоге объясняется, почему он не работает!
Cast
является методом расширения на IEnumerable
, а не IEnumerable
. Это означает, что к тому моменту, когда каждое значение дойдет до того момента, когда оно будет запущено, оно снова помещено в объект System.Object. По сути, он пытается это сделать:
int i = 1;
object o = i;
long l = (long)o;
Этот код генерирует InvalidCastException, которое вы получаете. Если вы пытаетесь применить int непосредственно к длинному, вы в порядке, но отбрасывание коробочного int back в long не работает.
Конечно, странность!