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
Patricia ArquetteOriginal
2025-01-10 08:15:42570Durchsuche

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>

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>

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>

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!

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