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
Lepaskan: 2025-01-10 10:38:42
asal
694 orang telah melayarinya

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());
        }
    }
}
Salin selepas log masuk

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;
Salin selepas log masuk

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;
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan