Rumah > pembangunan bahagian belakang > C++ > Mengapakah `Enumerable.Cast` Melemparkan `InvalidCastException` dalam .NET 3.5 SP1?

Mengapakah `Enumerable.Cast` Melemparkan `InvalidCastException` dalam .NET 3.5 SP1?

Linda Hamilton
Lepaskan: 2025-01-10 09:35:41
asal
956 orang telah melayarinya

Why Does `Enumerable.Cast` Throw an `InvalidCastException` in .NET 3.5 SP1?

Dalam .NET 3.5 SP1 Enumerable.Cast melontar InvalidCastException

Dalam .NET 3.5 SP1, tingkah laku istimewa diperhatikan apabila menggunakan kaedah Enumerable.Cast untuk menukar koleksi satu jenis kepada jenis lain. Kod berikut:

IEnumerable<int> list = new List<int>() { 1 };
IEnumerable<long> castedList = list.Cast<long>();
Console.WriteLine(castedList.First());
Salin selepas log masuk

melempar InvalidCastException tanpa diduga. Ralat yang membingungkan ini juga berlaku apabila menggunakan sintaks LINQ, seperti yang ditunjukkan dalam kod berikut:

var list = new[] { 1 };
var castedList = from long l in list select l;
Console.WriteLine(castedList.First());
Salin selepas log masuk

Dedahkan tingkah laku tersembunyi

Pada mulanya nampak mengelirukan mengapa penukaran ini gagal. Walau bagaimanapun, catatan blog memberi penerangan tentang isu yang berpotensi. Dalam .NET 3.5 SP1, kaedah Cast<T>() telah diubah suai untuk bertindak pada IEnumerable dan bukannya IEnumerable<T>. Oleh itu, setiap elemen dalam koleksi dimasukkan ke dalam System.Object sebelum mencapai peringkat penukaran.

Punca punca terdedah

Peralihan asas ini membawa kepada masalah halus. InvalidCastException pada asasnya disebabkan oleh mencuba penukaran berikut:

int i = 1;
object o = i;
long l = (long)o;
Salin selepas log masuk

Seperti yang ditunjukkan oleh kod ini, menukar int terus kepada long menghasilkan hasil yang dijangkakan, namun menukar int berkotak kepada long gagal. Ini menerangkan sebab coretan kod awal dan rakan LINQnya tidak berfungsi seperti yang diharapkan.

Mencari penyelesaian

Untuk mengelakkan pengecualian ini, penukaran mesti dilakukan secara eksplisit:

var castedList = list.Select(i => (long)i);
Salin selepas log masuk

Kaedah alternatif ini berjaya menukar setiap elemen tanpa menghadapi pengecualian penukaran yang tidak sah.

Tingkah laku luar biasa ini mengingatkan kita bahawa beberapa mekanisme halus di belakang tabir mungkin menjejaskan pelaksanaan kod. Untuk mengelakkan perangkap yang serupa pada masa hadapan, anda perlu meneroka alternatif atau mengendalikan penukaran secara eksplisit.

Atas ialah kandungan terperinci Mengapakah `Enumerable.Cast` Melemparkan `InvalidCastException` dalam .NET 3.5 SP1?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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