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.
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!