web-dev-qa-db-ja.com

Enumerable.CastがInvalidCastExceptionを発生させるのはなぜですか?

私が暗黙的に整数値をdoubleにキャストできる場合:

int a = 4;    
double b = a;
// now b holds 4.0

なぜこれができないのですか?

int[] intNumbers = {10, 6, 1, 9};    
double[] doubleNumbers2 = intNumbers.Cast<double>().ToArray();

「指定されたキャストは無効です」というInvalidCastException例外が発生します。

逆の操作(doubleからintへのキャスト)を実行すると、同じエラーが発生します。

何が悪いのですか?

40
outlookrperson

まあ、Castに対する期待は正しくありません。それだけです-ボクシング/アンボクシング、参照とIDの変換を処理するためのもので、それだけです。残念ながら、ドキュメントは:(ほど明確ではありません。

解決策はSelectを使用することです:

doubleNumbers2 = intNumbers.Select(x => (double) x).ToArray();
57
Jon Skeet

Jonの回答キャストに追加することは、主にIEnumerableを実装するオブジェクトにのみ役立ちますが、他には何もしません。 XmlNodeList を例にとります。 System.Xml.Linq名前空間を使用する余裕がない場合は、Cast<XmlElement>を使用して、それに対するいくつかのNice LINQクエリを作成できます。

var result = xmlNodeList
    .Cast<XmlElement>()
    .Select(e=> e.GetAttribute("A") + e.GetAttribute("B"))
    .ToArray();
9
ChaosPandion