Heim > Backend-Entwicklung > C++ > Warum löst „Enumerable.Cast' in .NET 3.5 SP1 eine „InvalidCastException' aus?

Warum löst „Enumerable.Cast' in .NET 3.5 SP1 eine „InvalidCastException' aus?

Linda Hamilton
Freigeben: 2025-01-10 09:35:41
Original
939 Leute haben es durchsucht

Why Does `Enumerable.Cast` Throw an `InvalidCastException` in .NET 3.5 SP1?

In .NET 3.5 SP1 Enumerable.Cast löst InvalidCastException

aus

In .NET 3.5 SP1 wurde ein besonderes Verhalten beobachtet, wenn die Enumerable.Cast-Methode zum Konvertieren einer Sammlung eines Typs in einen anderen Typ verwendet wurde. Der folgende Code:

<code class="language-csharp">IEnumerable<int> list = new List<int>() { 1 };
IEnumerable<long> castedList = list.Cast<long>();
Console.WriteLine(castedList.First());</code>
Nach dem Login kopieren

wirft InvalidCastException unerwartet. Dieser rätselhafte Fehler tritt auch bei Verwendung der LINQ-Syntax auf, wie im folgenden Code gezeigt:

<code class="language-csharp">var list = new[] { 1 };
var castedList = from long l in list select l;
Console.WriteLine(castedList.First());</code>
Nach dem Login kopieren

Verstecktes Verhalten aufdecken

Auf den ersten Blick erscheint es verwirrend, warum diese Konvertierung fehlschlägt. Ein Blogbeitrag beleuchtet jedoch die möglichen Probleme. In .NET 3.5 SP1 wurde die Methode Cast<T>() so geändert, dass sie auf IEnumerable statt auf IEnumerable<T> reagiert. Daher wird jedes Element in der Sammlung in System.Object eingepackt, bevor es die Konvertierungsphase erreicht.

Grundursache aufgedeckt

Diese grundlegende Verschiebung führt zu einem subtilen Problem. InvalidCastException wird im Wesentlichen durch den Versuch der folgenden Konvertierung verursacht:

<code class="language-csharp">int i = 1;
object o = i;
long l = (long)o;</code>
Nach dem Login kopieren

Wie dieser Code zeigt, führt die direkte Konvertierung von int in long zu den erwarteten Ergebnissen. Die Konvertierung eines umrahmten int in long schlägt jedoch fehl. Dies erklärt, warum das ursprüngliche Code-Snippet und sein LINQ-Gegenstück nicht wie erwartet funktionieren.

Auf der Suche nach Lösungen

Um diese Ausnahme zu vermeiden, muss die Konvertierung explizit durchgeführt werden:

<code class="language-csharp">var castedList = list.Select(i => (long)i);</code>
Nach dem Login kopieren

Diese alternative Methode konvertiert jedes Element erfolgreich, ohne dass eine ungültige Konvertierungsausnahme auftritt.

Dieses ungewöhnliche Verhalten erinnert uns daran, dass einige subtile Mechanismen hinter den Kulissen die Codeausführung beeinflussen können. Um ähnliche Fallstricke in Zukunft zu vermeiden, lohnt es sich, Alternativen zu prüfen oder die Konvertierung explizit zu behandeln.

Das obige ist der detaillierte Inhalt vonWarum löst „Enumerable.Cast' in .NET 3.5 SP1 eine „InvalidCastException' aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage