2009-05-14 6 views
8

は、次のコードリストにない(または可能な)<int> .Cast <Enum>()?

public enum Color 
{ 
    Blue=1, 
    Red=2, 
    Green=3 
} 

public List<Color> ConvertColorEnum() 
{ 
    var intColor = new List<int>(){1,2,3}; 
    return intColor.Cast<Color>().ToList(); 
} 

を試してみてください、あなたはConvertColorEnum()は、すなわち、List<Color>(){Color.Blue, Color.Red, Color.Green}の色のリストを返すと思いますか?

私はこれを、.net 3.5(mscorlibバージョン2.0.50727.1433)、.net 3.5 SP1(mscorlibバージョン2.0.50727.3082)の2台のマシンでテストしました。結果は異なっていました.net 3.5では、整数を列挙型に変換できないため、.net 3.5 SP1は正常に実行され、正しい結果が返されたため、InvalidCastExceptionが投げられました。

誰でも彼/彼女のマシンでこれを試し、結果を報告したり、それがなぜそうであるか説明したいと思いますか?

答えて

4

SP1と.NET 3.5フレームワークのオリジナルリリースの違いについては、in the release notesを参照してください。クエリの 句から によって書き換えられ、そのよう System.Collections.ArrayListなど 非ジェネリックコレクションを超えるLINQクエリ式で

は、ここでは、この特定の問題のために言っていることですコンパイラは、 キャスト演算子への呼び出しを含めるようにしました。キャストは のすべての要素タイプを クエリのfrom句で指定されたタイプ に変換します。また、元の Visual C#2008のリリースバージョンでは、 キャスト演算子も 値型変換と ユーザー定義変換を実行します。ただし、 これらの変換は によって実行され、標準のC#セマンティクスの代わりにSystem.Convertクラス が使用されます。これらの の変換によっても、特定の シナリオでは、重要な のパフォーマンスの問題が発生します。Visual C#2008 SP1では、 値型とユーザー定義の の変換で、 にInvalidCastExceptionをスローするように、キャスト演算子 が変更されています。この変更により、 標準以外のC#のキャスト セマンティクスとパフォーマンスの問題の両方が排除されます。 この変更は、次の例の に示されています。

さらに詳しい情報はthis blog postで入手できます。

17

代わりにSelectを使用してください。

return intColor.Select(i=>(Color)i).ToList(); 

なぜ...?

+0

@marc、私は約50Kで大声で言いますが、49,999であなたの痛いほど近いです;) –

+0

Vexing、そうではありません。 –

+0

良いアイデアだが、intColor.Cast ()はより簡潔で読みやすいとは思わない? – Graviton

4

キャスト拡張メソッドは、次に移動すると、元の列挙子の出力をオブジェクト変数に格納して(必要に応じてボクシングする)イテレータを使用して、結果の型にキャストしようとします。

ボックス化された形式の値型は、ボックス化されていない場合(さまざまな自動変換が可能な場合)と同じようにキャスト操作に応答せず、元のボックス化されていない形式にのみキャストできます。私はキャスト拡張の​​以前の実装は完全に異なってそれをやったり積分形式に変換する列挙型のためのいくつかの特別なケースを持っていたいずれかのことを想像

(あなたはすべての可能な形態に対処しなければならないとして、これはトリッキーです)

Marcの解答は正しい解決策であり、前述のボクシングの理由から実際にキャストより効率的です。

+0

ああ、 5__ab - 私はその1つを見つけなかった--- –

+0

- 私は、MSがソース全体をロードするのを簡単にしたいと思っています - たぶん、リフレクタープラグインを書いて、シンボルサーバーからそれをつかむようにしてください... – ShuggyCoUk

関連する問題