C# IEnumerable.Cast()与IEnumerable.Select()中的强制转换
假设我有一个C# IEnumerable.Cast()与IEnumerable.Select()中的强制转换,c#,linq,casting,enumerable,C#,Linq,Casting,Enumerable,假设我有一个IEnumerable,我想把它们转换成ASCII等效字符 对于单个整数,它只是(char)i,因此总是有集合。选择(i=>(char)i),但我认为使用集合.Cast()会稍微干净一些 有人能解释为什么我使用collection.Cast()而不是collection.Select(I=>(char)I)时会出现InvalidCastException 编辑:有趣的是,当我调用collection.OfType()时,我得到一个空集。类型的Cast和方法只执行引用和取消装箱转换。因
IEnumerable
,我想把它们转换成ASCII等效字符
对于单个整数,它只是(char)i
,因此总是有集合。选择(i=>(char)i)
,但我认为使用集合.Cast()
会稍微干净一些
有人能解释为什么我使用collection.Cast()
而不是collection.Select(I=>(char)I)
时会出现InvalidCastException
编辑:有趣的是,当我调用collection.OfType()
时,我得到一个空集。类型的Cast
和方法只执行引用和取消装箱转换。因此,他们无法将一种值类型转换为另一种值类型
这些方法在非泛型的IEnumerable
接口上运行,因此它们基本上是从IEnumerable
转换为IEnumerable
。因此,无法使用Cast
将IEnumerable
转换为IEnumerable
的原因与无法将装箱的int
转换为char
的原因相同
本质上,在您的示例中,Cast
会失败,因为以下失败:
object ascii = 65;
char ch = (char)ascii; <- InvalidCastException
对象ascii=65;
char ch=(char)ascii;谢谢有点违反直觉,但这是有道理的Jon Skeet的博客链接似乎断了。这里有另一个选项:@TylerGill,这个链接断了,因为文章一直在移动。这里有一个(其他)备用位置: