Maison > développement back-end > C++ > Pourquoi « IEnumerable.Cast » lance-t-il une « InvalidCastException » ?

Pourquoi « IEnumerable.Cast » lance-t-il une « InvalidCastException » ?

DDD
Libérer: 2025-01-10 07:37:43
original
341 Les gens l'ont consulté

Why Does `IEnumerable.Cast` Throw an `InvalidCastException`?

Comprendre InvalidCastException avec IEnumerable.Cast

Tenter de lancer un IEnumerable<int> vers un IEnumerable<long> en utilisant Cast<T> aboutit souvent à un InvalidCastException perplexe. Cette opération apparemment simple échoue en raison d'un mécanisme subtil au sein de la méthode Cast<T>. Prenons cet exemple :

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

La cause profonde : boxe et déballage

La clé pour comprendre cela réside dans le fonctionnement de Cast<T>. C'est une méthode d'extension sur IEnumerable, pas sur IEnumerable<T>. Cela signifie que chaque élément du IEnumerable<int> est d'abord encadré dans un System.Object avant que la conversion vers long ne soit tentée. Ceci est fonctionnellement équivalent à :

<code class="language-csharp">int i = 1;
object o = i;  // Boxing
long l = (long)o; // Unboxing and Cast - This throws the exception!</code>
Copier après la connexion

Le InvalidCastException se produit lors de l'étape de unboxing. Bien qu'un casting direct de int à long soit valide, le déballage d'un int en boîte vers un long ne l'est pas.

Résolution

Pour éviter cela InvalidCastException, utilisez une méthode qui gère la conversion dans le contexte IEnumerable<T> fortement typé, telle que Select :

<code class="language-csharp">IEnumerable<int> list = new List<int>() { 1 };
IEnumerable<long> castedList = list.Select(x => (long)x);
Console.WriteLine(castedList.First());</code>
Copier après la connexion

Cette approche effectue le casting directement sur chaque int élément avant que la boxe ne se produise, empêchant ainsi le InvalidCastException. Utiliser Select fournit une solution plus propre et plus efficace que de compter sur Cast<T> pour ce type de 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!

source:php.cn
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal