Почему делает это:
(new[]{1,2,3}).Cast<decimal>();
результат в
InvalidCastException: Указанный бросок не допустим.
Ага, Cast
этого не делает. В основном он просто ссылается на преобразования и преобразования распаковки, а не на преобразования между разными типами значений.
Используйте вместо этого:
(new[]{1,2,3}).Select(x => (decimal)x)
Обратите внимание, что до .NET 3.5 SP1, Cast
выполнило несколько преобразований больше, чем сейчас. Не знаю, сработало бы тогда это или нет, но сейчас точно не работает.
Cast не конвертируется.
Когда вы используете метод расширения Cast, он пытается преобразовать элемент на основе схемы наследования. Поскольку int не является производным от decimal, это нельзя сделать с помощью Cast. Вместо этого попробуйте следующее:
(new[] {1,2,3}).Select(x => (decimal)X);