2012-03-26 63 views
10

假设我有一个IEnumerable<int>,我希望这些转换成它们的ASCII等效字符。IEnumerable.Cast()vs cast在IEnumerable.Select()

对于一个整数,它只是(char)i,所以总是有collection.Select(i => (char)i),但我认为使用collection.Cast()会更简洁。

任何人都可以解释为什么我得到InvalidCastException当我使用collection.Cast<char>()但不是collection.Select(i => (char)i)

编辑:有趣的是,当我打电话给collection.OfType<char>()时,我得到一个空集。

回答

10

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了解更多详情。

+0

谢谢!有点反直觉,但它是有道理的 – hehewaffles 2012-03-26 03:34:58

+0

连接到Jon Skeet的博客似乎被打破。这是一个替代:http://edulinq.googlecode.com/hg/posts/33-CastAndOfType.html – 2014-07-22 23:38:14

+0

@TylerGill,这个链接也被打破 – 3per 2016-10-26 02:50:41