假设我有IEnumerable<int>
,我希望将它们转换为与ASCII等效的字符。
对于单个整数,它只是(char)i
,因此总是collection.Select(i => (char)i)
,但我认为使用collection.Cast()
会更清晰。
任何人都可以解释为什么我使用InvalidCastException
而不是collection.Cast<char>()
时会收到collection.Select(i => (char)i)
?
编辑:有趣的是,当我打电话给collection.OfType<char>()
时,我得到一个空集。
答案 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。