Enumerable.Cast の不可解なキャスト例外
整数 (int) の IEnumerable を IEnumerable にキャストしようとすると、InvalidCastException が発生します。示されているように、Cast 演算子を使用した長整数 (long)以下:
using System.Collections.Generic; using System.Linq; namespace InvalidCast { class Program { static void Main(string[] args) { // Initialize a list of ints IEnumerable<int> list = new List<int>() { 1 }; // Attempt to cast the list to longs IEnumerable<long> castedList = list.Cast<long>(); // Attempt to write the first element of the casted list Console.WriteLine(castedList.First()); } } }
この例外はなぜ発生しますか?
Cast 演算子は安全で信頼性の高い変換を実行することを目的としているため、この動作は予期せぬものです。ただし、この特定のケースは、.NET 3.5 と .NET 3.5 SP1 の間のキャストの動作の変更によって発生した特有の問題を示しています。
問題の根本
Cast 演算子は、IEnumerable (コレクションの基本インターフェイス) 用に定義された拡張メソッドであり、特に IEnumerable 用に定義されたものではありません。 IEnumerable
その結果、キャスト プロセスは次のようになります。
int i = 1; object o = i; long l = (long)o;
このコードボックス化された int を Long に直接キャストしようとすると、InvalidCastException がスローされます。 int.
回避策
この問題を解決するには、次のようにラムダ式または select メソッドを使用して明示的にキャストを実行する必要があります。
// Cast using a lambda expression var castedList = list.Select(i => (long)i); // Cast using a select method var castedList = from long l in list select l;
これらのアプローチは、各 int 値を明示的に long に変換し、ボックス化/アンボックス化プロセスを回避し、 InvalidCastException.
以上が「IEnumerable」からキャストするときに「Enumerable.Cast」が「InvalidCastException」をスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。