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
Libérer: 2025-01-10 09:35:41
original
956 Les gens l'ont consulté

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 :

IEnumerable<int> list = new List<int>() { 1 };
IEnumerable<long> castedList = list.Cast<long>();
Console.WriteLine(castedList.First());
Copier après la connexion

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 :

var list = new[] { 1 };
var castedList = from long l in list select l;
Console.WriteLine(castedList.First());
Copier après la connexion

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 :

int i = 1;
object o = i;
long l = (long)o;
Copier après la connexion

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 :

var castedList = list.Select(i => (long)i);
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal