2012-03-20 10 views
5

可能性の重複:
IEnumerable.Cast<>キャスト<T>を使用してint []をdouble []に​​変換しますか?

一つは、暗黙的にdoubleにint型から変換することができます。 「指定されたキャストは有効ではありません」ここで例外が発生しますか?

double[] a = Enumerable.Range(0, 7).Cast<double>().ToArray(); 

私はいくつかの "バージョン"を試しました。

P.S.私のような可能な解決策を知っている:

double[] a = Enumerable.Range(0, 7).Select(x => (double)x).ToArray(); 

をしかし、私はそれがとても明白に見えたこの例では動作しない理由キャストは=>どのように機能するか興味があります。

答えて

4

Castは、IEnumerable(タイプなし)をIEnumerable<T>(一般的にタイプされたもの)に変えるように作られている。それは実際にメンバーのいずれかを別々にキャスティングすることはありません。 this answerパー

: - ボクシング/アンボクシング、リファレンスとアイデンティティの変換に対処する を意味しています、そしてすべてです

さて、あなたはキャストの間違った期待を持って、それがすべてです。それはそれで、あなたは.Select()で立ち往生している

かもしれないとして明確 として文書であることを残念です。

+0

これを見れば、どのように "キャスト"しているのですか?int x = 42;ダブルd =(ダブル)x; '仕事? –

+3

リンク先の質問から受け入れられた回答を提供する代わりに、この質問を重複して閉じるのが適切でしょうか? –

+0

+1 Btw:選択がCastより速く、複数回テストしました。 –

3

これが失敗した理由は、基本的にあなたがこれをやっている理由:

 int x = 10; 
     object f = x; 
     double d = (double) f; 

intはオブジェクトに箱入りなっている、とあなたはそれをUnboxのために行くとき、あなたはそれをVHS版しようとしていますダブル。あなたが見ることができるように

public static IEnumerable<TResult> Cast<TResult>(this IEnumerable source) 
{ 
    IEnumerable<TResult> enumerable = source as IEnumerable<TResult>; 
    if (enumerable != null) 
    { 
     return enumerable; 
    } 
    if (source == null) 
    { 
     throw Error.ArgumentNull("source"); 
    } 
    return Enumerable.CastIterator<TResult>(source); 
} 

private static IEnumerable<TResult> CastIterator<TResult>(IEnumerable source) 
{ 
    foreach (object current in source) 
    { 
     yield return (TResult)current; 
    } 
    yield break; 
} 

、それはIEnumerableををループして、ソース内の各要素をボクシングの:

は具体的には、ここではキャストの実装です。それから、あなたはあなたを爆破します。

関連する問題