Heim > Backend-Entwicklung > C++ > Warum löst „Enumerable.Cast' beim Casting aus „IEnumerable' eine „InvalidCastException' aus?

Warum löst „Enumerable.Cast' beim Casting aus „IEnumerable' eine „InvalidCastException' aus?

Patricia Arquette
Freigeben: 2025-01-10 10:38:42
Original
693 Leute haben es durchsucht

Why Does `Enumerable.Cast` Throw an `InvalidCastException` When Casting from `IEnumerable`?

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());
        }
    }
}
Nach dem Login kopieren

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. Das bedeutet, dass die Werte bei der Umwandlung in Objekte vom Typ System.Object geboxt wurden.

Als Ergebnis ahmt der Umwandlungsprozess Folgendes nach:

int i = 1;
object o = i;
long l = (long)o;
Nach dem Login kopieren

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;
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage