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()); } } }
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
Akibatnya, proses pemutus meniru yang berikut:
int i = 1; object o = i; long l = (long)o;
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;
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!