2012-03-26 65 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