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()
我得到一个空集。
Cast
和OfType
方法仅执行引用和取消装箱转换。 因此,他们无法将一种值类型转换为另一种值类型。
这些方法在非通用IEnumerable
接口上运行,因此它们实际上是从IEnumerable
转换为IEnumerable
。 因此,您无法使用Cast
从IEnumerable
转换为IEnumerable
原因与您无法将装箱的int
转换为char
原因相同。
实际上,示例中的Cast
失败,因为以下操作失败:
object ascii = 65; char ch = (char)ascii; <- InvalidCastException
有关更多详细信息,请参阅Jon Skeet优秀的EduLinqpost 。