Maison >développement back-end >C++ >Comment la covariance et la contravariance améliorent-elles la sécurité et la flexibilité des types dans les interfaces C# ?

Comment la covariance et la contravariance améliorent-elles la sécurité et la flexibilité des types dans les interfaces C# ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-21 15:11:10546parcourir

How Do Covariance and Contravariance Enhance Type Safety and Flexibility in C# Interfaces?

Interfaces covariantes et contravariantes en C#

Les interfaces covariantes et contravariantes en C# offrent une plus grande flexibilité lors du traitement des types et de leurs hiérarchies d'héritage.

Interface covariante (sortie T)

Les interfaces covariantes spécifient que les paramètres de type générique peuvent être traités comme des types de niveau supérieur dans la hiérarchie d'héritage. Pour une interface déclarée comme interface IBibble<out T>, vous pouvez considérer la référence d'interface comme représentant un type dérivé de T.

Interface onduleur (en T)

Les interfaces contravariantes permettent de traiter les paramètres de type génériques comme des types de niveau inférieur dans la hiérarchie d'héritage. Lorsqu'une interface est définie comme interface IBibble<in T>, la référence d'interface peut être considérée comme un type représentant le type de base de T.

Applications pratiques de la covariance

Covariance permet de traiter une collection d'un type dérivé comme s'il s'agissait d'une collection d'un type de base. Par exemple, considérons une liste d’animaux, chacun portant un nom. Vous pouvez récupérer en toute sécurité les noms de tous les animaux car tous les animaux ont des noms.

Application pratique de l'onduleur

Contravariance permet d'ajouter des types dérivés à une collection de types de base. Par exemple, si vous avez accès à une collection Animaux et que vous devez y ajouter un poisson, vous pouvez le faire car tous les poissons sont des animaux. Cependant, il n'est pas permis de tenter de récupérer des poissons de la collection car il n'y a aucune garantie que la collection ne contienne que des poissons.

Emplacement d'entrée et de sortie

En C# 4.0, les mots-clés in et out marquent explicitement les interfaces comme covariantes ou contravariantes. in spécifie l'emplacement d'entrée (paramètres de méthode, propriétés en écriture seule), tandis que out indique l'emplacement de sortie (valeur de retour de la méthode, propriétés en lecture seule, out paramètres de méthode).

Exemple

L'exemple suivant démontre la covariance et la contravariance :

<code class="language-csharp">interface IBibbleOut<out T> { }
interface IBibbleIn<in T> { }

class Program
{
    static void Main(string[] args)
    {
        var b = GetOutDescendant(); // b只能保存Descendant对象
        var d = GetInBase(); // d可以接收Base和Descendant对象
    }

    static IBibbleOut<Descendant> GetOutDescendant() { return null; }
    static IBibbleIn<Base> GetInBase() { return null; }
}

class Base { }
class Descendant : Base { }</code>

Sans covariance et contravariance, le compilateur ne pourra pas garantir la sécurité des types dans l'exemple de code, ce qui peut entraîner des erreurs.

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