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>()时,我得到了一个空集。

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

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的精彩帖子。