2012-03-26 11 views
10

IEnumerable<int>があり、これらをASCII相当の文字に変換したいとします。IEnumerable.Select()でのキャスト対IEnumerable.Cast()

単一の整数の場合、それはちょうど(char)iになるので、常にcollection.Select(i => (char)i)ですが、それはcollection.Cast()を使用するのが少しお勧めです。

私がcollection.Cast<char>()を使用したときにInvalidCastExceptionを取得する理由は誰でも説明できますが、collection.Select(i => (char)i)では使用できません。

編集:面白いことに、私がcollection.OfType<char>()と呼ぶとき、私は空のセットを得る。

答えて

10

Cast<T>OfType<T>メソッドは、参照変換とアンボックス化変換のみ行います。したがって、ある値型を別の値型に変換することはできません。

これらのメソッドは非汎用のIEnumerableインターフェイスで動作するため、実質的にIEnumerable<object>からIEnumerable<T>に変換されます。そのため、からIEnumerable<char>への変換にCast<T>を使用できない理由は、ボックス化されたintcharにキャストできないのと同じ理由です。

次が失敗したため、基本的に、あなたの例ではCast<char>は失敗します。詳細は

object ascii = 65; 
char ch = (char)ascii; <- InvalidCastException 

を参照してくださいジョンスキートの優れたEduLinq postを。

+0

ありがとうございました!ちょっと直感的ですが、意味があります – hehewaffles

+0

Jon Skeetのブログへのリンクが壊れているようです。別の方法があります:http://edulinq.googlecode.com/hg/posts/33-CastAndOfType.html –

+0

@TylerGill、このリンクも壊れています – 3per

関連する問題