Heim >Backend-Entwicklung >C++ >Warum löst „IEnumerable.Cast' eine „InvalidCastException' aus?

Warum löst „IEnumerable.Cast' eine „InvalidCastException' aus?

DDD
DDDOriginal
2025-01-10 07:37:43345Durchsuche

Why Does `IEnumerable.Cast` Throw an `InvalidCastException`?

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!

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