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
Patricia ArquetteOriginal
2025-01-10 10:38:42694Durchsuche

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());
        }
    }
}

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;

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!

Stellungnahme:
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