Heim >Backend-Entwicklung >C++ >Warum löst „IEnumerable.Cast' eine „InvalidCastException' aus?
Verstehen InvalidCastException
mit IEnumerable.Cast
Der Versuch, mit IEnumerable<int>
ein IEnumerable<long>
in ein Cast<T>
umzuwandeln, führt oft zu einem verwirrenden InvalidCastException
. Dieser scheinbar einfache Vorgang schlägt aufgrund eines subtilen Mechanismus innerhalb der Cast<T>
-Methode fehl. Betrachten Sie dieses Beispiel:
<code class="language-csharp">IEnumerable<int> list = new List<int>() { 1 }; IEnumerable<long> castedList = list.Cast<long>(); Console.WriteLine(castedList.First());</code>
Die Grundursache: Ein- und Auspacken
Der Schlüssel zum Verständnis liegt in der Funktionsweise von Cast<T>
. Es handelt sich um eine Erweiterungsmethode für IEnumerable
, nicht für IEnumerable<T>
. Dies bedeutet, dass jedes Element im IEnumerable<int>
zuerst in ein eingepacktSystem.Object
wird, bevor die Umwandlung in long
versucht wird. Dies entspricht funktional:
<code class="language-csharp">int i = 1; object o = i; // Boxing long l = (long)o; // Unboxing and Cast - This throws the exception!</code>
Das InvalidCastException
erfolgt während des Schritts Unboxing. Während eine direkte Umwandlung von int
nach long
gültig ist, ist das Auspacken eines verpackten int
in ein long
nicht gültig.
Auflösung
Um dies zu vermeiden InvalidCastException
, verwenden Sie eine Methode, die die Umwandlung innerhalb des stark typisierten IEnumerable<T>
-Kontexts verarbeitet, z. B. Select
:
<code class="language-csharp">IEnumerable<int> list = new List<int>() { 1 }; IEnumerable<long> castedList = list.Select(x => (long)x); Console.WriteLine(castedList.First());</code>
Dieser Ansatz führt die Umwandlung direkt für jedes int
Element durch, bevor das Boxen auftritt, wodurch das InvalidCastException
verhindert wird. Die Verwendung von Select
bietet eine sauberere und effizientere Lösung als die Verwendung von Cast<T>
für diese Art der Konvertierung.
Das obige ist der detaillierte Inhalt vonWarum löst „IEnumerable.Cast' eine „InvalidCastException' aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!