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,这个链接断了,因为文章一直在移动。这里有一个(其他)备用位置: