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
Linda Hamiltonasal
2025-01-10 09:35:41939semak imbas

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:

<code class="language-csharp">IEnumerable<int> list = new List<int>() { 1 };
IEnumerable<long> castedList = list.Cast<long>();
Console.WriteLine(castedList.First());</code>

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

<code class="language-csharp">var list = new[] { 1 };
var castedList = from long l in list select l;
Console.WriteLine(castedList.First());</code>

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:

<code class="language-csharp">int i = 1;
object o = i;
long l = (long)o;</code>

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:

<code class="language-csharp">var castedList = list.Select(i => (long)i);</code>

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:
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