Heim > Backend-Entwicklung > C++ > Warum löst „IEnumerable.Cast()' in .NET 3.5 SP1 eine „InvalidCastException' aus?

Warum löst „IEnumerable.Cast()' in .NET 3.5 SP1 eine „InvalidCastException' aus?

Patricia Arquette
Freigeben: 2025-01-10 08:15:42
Original
556 Leute haben es durchsucht

Why Does `IEnumerable.Cast()` Throw an `InvalidCastException` in .NET 3.5 SP1?

Lüften Sie das Geheimnis von Enumerable.Cast()geworfenInvalidCastException

In .NET 3.5 SP1 wurde beim Konvertieren von Cast<T>() mit IEnumerable rätselhafterweise eine InvalidCastException-Ausnahme ausgelöst. Betrachten Sie den folgenden Code:

<code class="language-csharp">IEnumerable<int> list = new List<int>() { 1 };
IEnumerable<long> castedList = list.Cast<long>();
Console.WriteLine(castedList.First());</code>
Nach dem Login kopieren

Warum löst dieser Code eine Ausnahme aus?

Dieses ungewöhnliche Verhalten ist auf Änderungen im Verhalten der Cast<T>()-Methode zwischen .NET 3.5 und .NET 3.5 SP1 zurückzuführen. Vor SP1 wirkte Cast<T>() auf IEnumerable<T> und ermöglichte so eine direkte Konvertierung. In SP1 wurde es jedoch so geändert, dass es mit IEnumerable funktioniert, was bedeutet, dass das Element vor der Konvertierung in System.Object entpackt wird.

Dieser Unboxing-Vorgang führt zu InvalidCastException, da im Gegensatz zur direkten Konvertierung von int in long die Konvertierung eines geboxten int in long nicht zulässig ist. Tatsächlich versucht dieser Code Folgendes zu tun:

<code class="language-csharp">int i = 1;
object o = i;
long l = (long)o;</code>
Nach dem Login kopieren

Dies führt auch zum selben InvalidCastException.

Lösungen und Erklärungen

Um dieses Problem zu lösen, können Sie Lambda-Ausdrücke verwenden, um die Elemente explizit zu konvertieren:

<code class="language-csharp">var castedList = list.Select(i => (long)i);</code>
Nach dem Login kopieren

Dadurch wird das Element erfolgreich in long konvertiert.

Der Grund für dieses Verhalten von

ist, dass Cast<T>() eine Erweiterungsmethode von IEnumerable ist, nicht von IEnumerable<T>. Wenn Elemente die Transformationsphase erreichen, wurden sie bereits als object eingerahmt. Dies führt zu object bei der Konvertierung von InvalidCastException in einen bestimmten Typ.

Das obige ist der detaillierte Inhalt vonWarum löst „IEnumerable.Cast()' in .NET 3.5 SP1 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