Rätselhafte Cast-Ausnahme in Enumerable.Cast
Eine InvalidCastException tritt auf, wenn versucht wird, ein IEnumerable mit Ganzzahlen (ints) in ein IEnumerable mit umzuwandeln lange Ganzzahlen (Longs) mithilfe des Cast-Operators, wie gezeigt unten:
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()); } } }
Warum tritt diese Ausnahme auf?
Dieses Verhalten ist unerwartet, da der Cast-Operator eine sichere und zuverlässige Konvertierung durchführen soll. Dieser spezielle Fall zeigt jedoch ein besonderes Problem, das bei einer Änderung des Cast-Verhaltens zwischen .NET 3.5 und .NET 3.5 SP1 auftrat.
Die Wurzel des Problems
Der Cast-Operator ist eine Erweiterungsmethode, die für IEnumerable (die Basisschnittstelle für Sammlungen) definiert ist, nicht speziell für IEnumerable
Als Ergebnis ahmt der Umwandlungsprozess Folgendes nach:
int i = 1; object o = i; long l = (long)o;
Dieser Code löst die InvalidCastException aus, wenn versucht wird, einen geboxten Int in einen Long-Wert umzuwandeln, anstatt ihn direkt umzuwandeln int.
Problemumgehung
Um dieses Problem zu beheben, ist es notwendig, die Umwandlung explizit mit einem Lambda-Ausdruck oder einer Select-Methode wie folgt durchzuführen:
// 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;
Diese Ansätze wandeln jeden int-Wert explizit in einen long-Wert um, wodurch der Boxing-/Unboxing-Prozess vermieden und das umgangen wird InvalidCastException.
Das obige ist der detaillierte Inhalt vonWarum löst „Enumerable.Cast' beim Casting aus „IEnumerable' eine „InvalidCastException' aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!