Maison > développement back-end > C++ > Comment puis-je convertir en toute sécurité une « liste » en « liste » en C# ?

Comment puis-je convertir en toute sécurité une « liste » en « liste » en C# ?

Mary-Kate Olsen
Libérer: 2025-01-09 22:51:46
original
682 Les gens l'ont consulté

How Can I Safely Cast a `List` to a `List` in C#?

Convertissez en toute sécurité List en List En C#, lorsque vous traitez l'héritage et les types génériques, vous pouvez rencontrer des situations dans lesquelles vous devez convertir une liste d'objets de classe dérivés en une liste d'objets de classe de base. Cela peut entraîner des problèmes si la classe de base contient des méthodes virtuelles remplacées dans la classe dérivée.

Considérons l'exemple suivant :

Lors de la compilation de ce code, vous rencontrerez le message d'erreur « Paramètre 1 : Impossible de convertir de 'System.Collections.Generic.List
<code class="language-csharp">class Animal
{
    public virtual void Play(List<Animal> animals) { }
}

class Cat : Animal
{
    public override void Play(List<Animal> animals)
    {
        // Cat 特定的实现
    }
}

class Program
{
    static void Main(string[] args)
    {
        Cat cat = new Cat();
        cat.Play(new List<Cat>()); // 错误:参数 1 无法从“System.Collections.Generic.List<Cat>”转换为“System.Collections.Generic.List<Animal>”
    }
}</code>
Copier après la connexion
' en 'System.Collections.Generic.List

'". En effet, bien que la classe Cat remplace la méthode Play, le type de paramètre de méthode (List) reste le même. Afin de résoudre ce problème, vous devez comprendre le concept de covariance générique. La covariance générique vous permet d'étendre en toute sécurité le type d'un paramètre dans une substitution de classe dérivée. Dans ce cas, vous souhaitez étendre le type de paramètre de List

à List

. C# 4 introduit la prise en charge de la covariance générique, avec l'aide de IEnumerable

et de son interface sécurisée pour la covariance. En déclarant la méthode Play dans la classe Animal comme :

Puis remplacez-le dans la classe Cat :
<code class="language-csharp">public virtual void Play(IEnumerable<Animal> animals) { }</code>
Copier après la connexion

Vous pouvez rendre la méthode Play sûre de manière covariante. Cela vous permet de transmettre un List
<code class="language-csharp">public override void Play(IEnumerable<Animal> animals) { }</code>
Copier après la connexion
à la méthode, puis d'utiliser la covariance pour le convertir en toute sécurité en IEnumerable

. Le code modifié ressemble à ceci :

Ce code sera compilé et exécuté avec succès sans erreur, vous permettant de convertir en toute sécurité List< lorsqu'une méthode de classe de base est définie à l'aide de IEnumerable et qu'une classe dérivée la remplace à l'aide de IEnumerable à List.
<code class="language-csharp">class Animal
{
    public virtual void Play(IEnumerable<Animal> animals) { }
}

class Cat : Animal
{
    public override void Play(IEnumerable<Animal> animals) { }
}

class Program
{
    static void Main()
    {
        Cat cat = new Cat();
        cat.Play(new List<Cat>()); 
    }
}</code>
Copier après la connexion

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
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