假设我有一个IEnumerable<int>
我希望将它们转换为 ASCII 等效字符。
对于单个整数,它只是(char)i
,所以总有collection.Select(i => (char)i)
,但我认为使用它会更干净一些collection.Cast()
.
谁能解释一下为什么我得到一个InvalidCastException
当我使用collection.Cast<char>()
但不与collection.Select(i => (char)i)
?
编辑:有趣的是,当我打电话时collection.OfType<char>()
我得到一个空集。
The Cast<T>
and OfType<T>
方法仅执行引用和拆箱转换。因此他们无法将一种值类型转换为另一种值类型。
这些方法在非泛型上运行IEnumerable
接口,所以它们本质上是从IEnumerable<object>
to IEnumerable<T>
。所以,你不能使用的原因Cast<T>
转换自IEnumerable<int>
to IEnumerable<char>
这和你不能投盒装的原因是一样的吗int
to a char
.
本质上,Cast<char>
在您的示例中失败是因为以下失败:
object ascii = 65;
char ch = (char)ascii; <- InvalidCastException
看看乔恩·斯基特的精彩表演教育林克帖子 https://codeblog.jonskeet.uk/2011/01/13/reimplementing-linq-to-objects-part-33-cast-and-oftype/更多细节。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)