为什么会出现这种情况:
(new[]{1,2,3}).Cast<decimal>();
导致“无效的强制类型转换异常:指定的转换无效。”
是的,Cast
不会这样做。基本上它只进行引用转换和取消装箱转换 - 不会在不同值类型之间进行转换。
改用这个:
(new[]{1,2,3}).Select(x => (decimal)x)
请注意,在.NET 3.5 SP1之前,Cast
方法进行了比现在更多的转换。我不知道它是否能在那时工作,但现在肯定不能。
Cast(强制转换)和Convert(类型转换)是不同的概念。
使用Cast扩展方法时,它会根据继承结构尝试将项目强制转换。由于int并不是从decimal派生的,因此无法使用Cast进行转换。请改用以下方法:
(new[] {1,2,3}).Select(x => (decimal)X);
Cast
在IEnumerable
(因此对象)上而不是IEnumerable<T>
上 - 因此它是一种拆装箱转换而不是两个值类型之间的转换。 (在那种情况下,直接转换也无法工作)。 不过话说回来,我永远找不到你解释Cast
之前的用途(在SP1之前)的帖子。 - Jon Skeet