IEnumerable.Cast()vs IEnumerable.Select()中的强制转换

假设我有一个IEnumerable ,我希望将它们转换为与ASCII等效的字符。

对于一个整数,它只是(char)i ,所以总是有collection.Select(i => (char)i) ,但我认为使用collection.Cast()会有点干净。

当我使用collection.Cast()而不是collection.Select(i => (char)i)时,有人可以解释为什么我得到InvalidCastException吗?

编辑:有趣的是,当我调用collection.OfType()我得到一个空集。

CastOfType方法仅执行引用和取消装箱转换。 因此,他们无法将一种值类型转换为另一种值类型。

这些方法在非通用IEnumerable接口上运行,因此它们实际上是从IEnumerable转换为IEnumerable 。 因此,您无法使用CastIEnumerable转换为IEnumerable原因与您无法将装箱的int转换为char原因相同。

实际上,示例中的Cast失败,因为以下操作失败:

 object ascii = 65; char ch = (char)ascii; <- InvalidCastException 

有关更多详细信息,请参阅Jon Skeet优秀的EduLinqpost 。