IEnumerable.Cast()与IEnumeraable.Select()中的强制转换
本文关键字:转换 IEnumeraable Cast IEnumerable Select | 更新日期: 2023-09-27 18:29:09
假设我有一个IEnumerable<int>
,我希望将它们转换为ASCII等效字符。
对于一个整数,它只是(char)i
,所以总是有collection.Select(i => (char)i)
,但我认为使用collection.Cast()
会更干净一些。
有人能解释为什么我使用collection.Cast<char>()
而不使用collection.Select(i => (char)i)
时会得到InvalidCastException
吗?
编辑:有趣的是,当我调用collection.OfType<char>()
时,我得到了一个空集。
Cast<T>
和OfType<T>
方法仅执行引用和开箱转换。因此,他们无法将一种值类型转换为另一种值。
这些方法在非通用IEnumerable
接口上操作,因此它们本质上是从IEnumerable<object>
转换为IEnumerable<T>
。因此,不能使用Cast<T>
从IEnumerable<int>
转换为IEnumerable<char>
的原因与不能将装箱的int
转换为char
的原因相同。
从本质上讲,您的示例中的Cast<char>
失败是因为以下失败:
object ascii = 65;
char ch = (char)ascii; <- InvalidCastException
有关更多详细信息,请参阅Jon Skeet在EduLinq的精彩帖子。