ホームページ >バックエンド開発 >C++ >「IEnumerable」からキャストするときに「Enumerable.Cast」が「InvalidCastException」をスローするのはなぜですか?

「IEnumerable」からキャストするときに「Enumerable.Cast」が「InvalidCastException」をスローするのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-10 10:38:42742ブラウズ

Why Does `Enumerable.Cast` Throw an `InvalidCastException` When Casting from `IEnumerable`?

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。これは、値がキャストされるときに、値が System.Object 型のオブジェクトにボックス化されていることを意味します。

その結果、キャスト プロセスは次のようになります。

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。