Rumah >pembangunan bahagian belakang >C++ >Mengapakah `IEnumerable.Cast` Melemparkan `InvalidCastException`?
Pemahaman InvalidCastException
dengan IEnumerable.Cast
Percubaan untuk menghantar IEnumerable<int>
ke IEnumerable<long>
menggunakan Cast<T>
selalunya mengakibatkan InvalidCastException
yang membingungkan. Operasi yang kelihatan mudah ini gagal disebabkan oleh mekanisme halus dalam kaedah Cast<T>
. Pertimbangkan contoh ini:
<code class="language-csharp">IEnumerable<int> list = new List<int>() { 1 }; IEnumerable<long> castedList = list.Cast<long>(); Console.WriteLine(castedList.First());</code>
Punca Punca: Tinju dan Nyah Tinju
Kunci untuk memahami perkara ini terletak pada cara Cast<T>
berfungsi. Ia adalah kaedah lanjutan pada IEnumerable
, bukan IEnumerable<T>
. Ini bermakna setiap elemen dalam IEnumerable<int>
terlebih dahulu dikotak menjadi System.Object
sebelum pelakon ke long
dicuba. Fungsi ini bersamaan dengan:
<code class="language-csharp">int i = 1; object o = i; // Boxing long l = (long)o; // Unboxing and Cast - This throws the exception!</code>
InvalidCastException
berlaku semasa langkah nyah kotak. Walaupun pelakon langsung daripada int
hingga long
adalah sah, membuka kotak int
ke long
adalah tidak.
Penyelesaian
Untuk mengelakkan perkara ini InvalidCastException
, gunakan kaedah yang mengendalikan pelakon dalam konteks IEnumerable<T>
taip kuat, seperti Select
:
<code class="language-csharp">IEnumerable<int> list = new List<int>() { 1 }; IEnumerable<long> castedList = list.Select(x => (long)x); Console.WriteLine(castedList.First());</code>
Pendekatan ini melakukan lakonan secara langsung pada setiap int
elemen sebelum tinju berlaku, menghalang InvalidCastException
. Menggunakan Select
menyediakan penyelesaian yang lebih bersih dan lebih cekap daripada bergantung pada Cast<T>
untuk jenis penukaran ini.
Atas ialah kandungan terperinci Mengapakah `IEnumerable.Cast` Melemparkan `InvalidCastException`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!