Maison >développement back-end >C++ >Pourquoi « Enumerable.Cast » lance-t-il une « InvalidCastException » dans .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!