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帖子.