Cast
используется для преобразования неуниверсальной коллекции в общую, т.е. выполняет операцию распаковки.Его нельзя использовать так, как вы хотите.
Когда вы посмотрите на реализацию Cast
и CastIterator
, которую он использует, вы увидите, что он берет объект и приводит его к указанному типу:
foreach (object current in source)
{
yield return (TResult)current;
}
Это работает, только если current
действительно является TResult
.В этом случае пользовательские преобразования не применяются.
Это поведение по умолчанию, вы можете проверить его самостоятельно:
double d = 0.0;
object tmp = d;
int i = (int)tmp; // throws the same exception you are getting
То, что вы хотите, лучше всего достигается с помощью простого Select
, если tblStocks
универсальное перечислимое значение:
List<JsonStock> stock = repository.Single(id).tblStocks
.Select(x => (JsonStock)x).ToList();
Или, если tblStocks
не перечислимое универсальное перечисление, вам нужно объединить Cast
и Select
:
List<JsonStock> stock = repository.Single(id).tblStocks.Cast<tblStock>()
.Select(x => (JsonStock)x).ToList();
Это будет первымраспакуйте объекты в tblStocks
в их реальный тип (tblStock
) и затем приведите их к нужному типу (JsonStocks
).