Rumah >pembangunan bahagian belakang >C++ >Mengapakah `Enumerable.Cast` Melemparkan `InvalidCastException` Apabila Menghantar daripada `IEnumerable`?

Mengapakah `Enumerable.Cast` Melemparkan `InvalidCastException` Apabila Menghantar daripada `IEnumerable`?

Patricia Arquette
Patricia Arquetteasal
2025-01-10 10:38:42742semak imbas

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

Pengecualian Cast Membingungkan dalam Enumerable.Cast

InvalidCastException ditemui apabila cuba menghantar IEnumerable integer (int) ke IEnumerable of integer panjang (panjang) menggunakan operator Cast, seperti yang dilihat di bawah:

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());
        }
    }
}

Mengapa pengecualian ini berlaku?

Tingkah laku ini tidak dijangka kerana pengendali Cast bertujuan untuk melakukan penukaran yang selamat dan boleh dipercayai. Walau bagaimanapun, kes khusus ini menunjukkan isu pelik yang timbul dengan pengubahsuaian dalam tingkah laku Cast antara .NET 3.5 dan .NET 3.5 SP1.

Akar Masalah

Pengendali Cast ialah kaedah sambungan yang ditakrifkan untuk IEnumerable (antara muka asas untuk koleksi), bukan khusus untuk IEnumerable. Ini bermakna apabila nilai dihantar, ia telah dikotak-kotakkan ke dalam objek jenis System.Object.

Akibatnya, proses pemutus meniru yang berikut:

int i = 1;
object o = i;
long l = (long)o;

Kod ini melontar InvalidCastException kerana ia cuba menghantar int berkotak ke panjang, bukannya terus menghantar int.

Penyelesaian

Untuk menyelesaikan isu ini, pelakon perlu dilakukan secara eksplisit menggunakan ungkapan lambda atau kaedah pilih, seperti berikut:

// 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;

Pendekatan ini secara eksplisit menukarkan setiap nilai int kepada nilai panjang, mengelakkan proses tinju/nyah kotak dan memintas InvalidCastException.

Atas ialah kandungan terperinci Mengapakah `Enumerable.Cast` Melemparkan `InvalidCastException` Apabila Menghantar daripada `IEnumerable`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn