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

heh*_*les 10 c# linq casting enumerable

假设我有一个IEnumerable<int>,我希望将它们转换为ASCII等效字符.

对于一个整数,它只是(char)i,所以总是collection.Select(i => (char)i),但我认为这将是一个有点清洁使用collection.Cast().

任何人都可以解释为什么我InvalidCastException在使用时得到的collection.Cast<char>()却没有collection.Select(i => (char)i)

编辑:有趣的是,当我打电话时,collection.OfType<char>()我得到一个空集.

And*_*per 11

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
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅Jon Skeet的优秀EduLinq帖子.