Rumah >pembangunan bahagian belakang >C++ >Mengapakah `Enumerable.Cast` Melemparkan `InvalidCastException` dalam .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!