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

时间:2012-03-26 03:15:51

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

1 个答案:

答案 0 :(得分: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

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