Maison >développement back-end >C++ >Pourquoi une «liste» ne peut-elle pas être directement attribuée à une variable «liste» en C #?

Pourquoi une «liste» ne peut-elle pas être directement attribuée à une variable «liste» en C #?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-28 13:31:09859parcourir

Why Can't a `List` Be Directly Assigned to a `List` Variable in C#?

Pourquoi un List<string> ne peut-il pas être affecté à un List<object> en C #?

En C #, attribuer directement une variable List<string> à une variable List<object> entraîne une erreur du compilateur. La conversion implicite n'est pas autorisée, et le casting explicite en utilisant (List<object>) échoue également.

La raison:

Cette restriction est due à la sécurité du type. Imaginez si une telle affectation était autorisée. Vous pouvez ensuite ajouter un objet d'un type autre que string (par exemple, un entier ou une classe personnalisée) au List<object>. Cependant, ce List<object> était à l'origine un List<string>. Tenter d'accéder aux éléments à partir de cette liste à l'aide d'une référence string conduirait à un System.InvalidCastException lors de la rencontre d'un élément non-corde. Le compilateur empêche cette erreur d'exécution potentielle en interdisant l'attribution.

SULLAGES:

Bien qu'une affectation directe ne soit pas possible, vous pouvez réaliser l'effet souhaité en utilisant d'autres méthodes:

  1. Copie itérative: L'approche la plus simple est d'itérer à travers le List<string> et d'ajouter chaque élément individuellement à un nouveau List<object>.

  2. linq: Une solution plus concise utilise la méthode Cast<T> de Linq:

    <code class="language-csharp">List<string> stringList = new List<string> { "apple", "banana", "cherry" };
    List<object> objectList = stringList.Cast<object>().ToList();</code>

coulée inverse:

Le casting inversé - de List<object> à List<string> - est une question différente. Ceci est généralement pas autorisé à moins que vous ne soyez absolument certain que chaque élément du List<object> est en fait un string. Tenter de lancer lorsque cela n'est pas vrai, une exception d'exécution. C # applique la sécurité de type pour empêcher de tels scénarios. Vous devez effectuer des chèques ou utiliser la méthode OfType<T> de Linq pour filtrer et lancer uniquement les éléments de chaîne.

Par conséquent, bien que le fonctionnement inverse puisse sembler analogue, les mécanismes de sécurité de type sous-jacent en C # l'empêchent d'être une opération simple. Un examen attentif des types d'éléments est crucial lorsque vous travaillez avec des listes génériques et des conversions de type.

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