Explication détaillée des interfaces de covariance et d'inversion C#
La covariance et la contravariance sont utilisées pour décrire la relation entre une interface et les types qu'elle peut référencer. Ils contrôlent la manière dont le compilateur vérifie la sécurité des affectations entre des variables de différents types.
Covariance
Lorsqu'une interface est déclarée à l'aide de la syntaxe <out T>
, il s'agit d'une interface covariante. Cela signifie qu'il peut contenir une référence à un type supérieur de T dans la hiérarchie d'héritage. Par conséquent, les variables d'un type d'interface covariante peuvent être affectées à des variables d'un type plus général. Par exemple, IEnumerable<Animal>
peut être attribué en toute sécurité à IEnumerable<Object>
.
Onduleur
En revanche, les interfaces déclarées à l'aide de la syntaxe <in T>
sont des interfaces contravariantes. Il peut contenir une référence à un type inférieur de T dans la hiérarchie d'héritage. Par conséquent, les variables de types d’interface contravariants peuvent être affectées à des variables de types plus spécifiques. Par exemple, Action<Animal>
peut être attribué à Action<Cat>
.
Application pratique
La covariance et la contravariance en programmation C# présentent les avantages suivants :
Exemple
Considérons l'exemple suivant :
<code class="language-csharp">interface IBibbleOut<out T> { } interface IBibbleIn<in T> { } class Base { } class Descendant : Base { } class Program { static void Main(string[] args) { // 协变示例:派生类引用可以赋值给基类引用。 IBibbleOut<Base> b = GetOutDescendant(); // 逆变示例:基类引用可以赋值给派生类引用。 IBibbleIn<Descendant> d = GetInBase(); } static IBibbleOut<Descendant> GetOutDescendant() => null; static IBibbleIn<Base> GetInBase() => null; }</code>
Sans covariance et contravariance, le code de cet exemple ne serait pas compilé en raison de problèmes de sécurité de type. Cependant, avec ces garanties en place, le compilateur peut valider l'affectation et permettre au code de s'exécuter en toute sécurité.
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!