假设我有一个IEnumerable<int>
,我想这些被转换成它们的ASCII等效字符。
对于一个整数,这纯粹是(char)i
,所以总有collection.Select(i => (char)i)
,但我认为这将是一点点清洁剂使用collection.Cast()
。
任何人都可以解释为什么我得到一个InvalidCastException
当我使用collection.Cast<char>()
但不与collection.Select(i => (char)i)
?
编辑:有趣的是,当我打电话collection.OfType<char>()
我得到一个空集。
的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
见乔恩斯基特的优秀EduLinq post了解更多详情。