Maison >développement back-end >C++ >Pourquoi « Enumerable.Cast » lance-t-il une « InvalidCastException » dans .NET 3.5 SP1 ?

Pourquoi « Enumerable.Cast » lance-t-il une « InvalidCastException » dans .NET 3.5 SP1 ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-10 09:35:41955parcourir

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

Dans .NET 3.5 SP1 Enumerable.Cast lance InvalidCastException

Dans .NET 3.5 SP1, un comportement spécial a été observé lors de l'utilisation de la méthode Enumerable.Cast pour convertir une collection d'un type en un autre type. Le code suivant :

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

lance InvalidCastException de manière inattendue. Cette erreur déroutante se produit également lors de l'utilisation de la syntaxe LINQ, comme indiqué dans le code suivant :

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

Révéler les comportements cachés

Au début, il semble difficile de savoir pourquoi cette conversion échoue. Cependant, un article de blog met en lumière les problèmes potentiels. Dans .NET 3.5 SP1, la méthode Cast<T>() a été modifiée pour agir sur IEnumerable au lieu de IEnumerable<T>. Par conséquent, chaque élément de la collection est encadré dans System.Object avant d'atteindre l'étape de conversion.

Cause profonde exposée

Ce changement fondamental conduit à un problème subtil. InvalidCastException est essentiellement provoqué par la tentative de conversion suivante :

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

Comme le montre ce code, la conversion de int directement en long produit les résultats attendus ; cependant, la conversion d'un int encadré en long échoue. Cela explique pourquoi l'extrait de code initial et son homologue LINQ ne fonctionnent pas comme prévu.

À la recherche de solutions

Pour éviter cette exception, la conversion doit être effectuée explicitement :

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

Cette méthode alternative convertit avec succès chaque élément sans rencontrer d'exception de conversion non valide.

Ce comportement inhabituel nous rappelle que certains mécanismes subtils en coulisses peuvent affecter l'exécution du code. Pour éviter des pièges similaires à l'avenir, il vaut la peine d'explorer des alternatives ou de gérer explicitement la conversion.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn