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

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

DDD
Freigeben: 2025-01-10 07:37:43
Original
403 Leute haben es durchsucht

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:

IEnumerable<int> list = new List<int>() { 1 };
IEnumerable<long> castedList = list.Cast<long>();
Console.WriteLine(castedList.First());
Nach dem Login kopieren

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:

int i = 1;
object o = i;  // Boxing
long l = (long)o; // Unboxing and Cast - This throws the exception!
Nach dem Login kopieren

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:

IEnumerable<int> list = new List<int>() { 1 };
IEnumerable<long> castedList = list.Select(x => (long)x);
Console.WriteLine(castedList.First());
Nach dem Login kopieren

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!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage