首页 >后端开发 >C++ >协变和逆变如何增强 C# 中的接口使用?

协变和逆变如何增强 C# 中的接口使用?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-21 15:21:10287浏览

How Do Covariance and Contravariance Enhance Interface Usage in C#?

深入理解C#中的协变和逆变接口

协变和逆变是面向对象编程中的概念,定义了引用如何与不同类型一起使用。在C#中,可以使用<out T><in T>语法分别将接口标记为协变或逆变。

协变

在C#中,协变允许将接口引用视为层次结构中更高类型的引用。例如,接口IBibble<out T>可以赋值为IBibble<Descendant>的实例引用,只要Descendant类继承自T类型。这意味着任何可以在IBibble<T>上执行的操作也可以在IBibble<Descendant>上执行。

逆变

在C#中,逆变允许将接口引用视为层次结构中较低类型的引用。例如,接口IBibble<in T>可以赋值为IBibble<Base>的实例引用,只要Base类型继承自T类型。这意味着任何可以赋值给IBibble<Base>的对象也可以赋值给IBibble<Descendant>

用途和应用

协变在处理共享公共基类型的对象集合时非常有用。通过使用协变接口,我们可以确保对基类型执行的操作也适用于所有派生类型。

逆变在处理接受不同类型参数的工厂或委托时非常有用。通过使用逆变接口,我们可以确保任何可以赋值给基类型的对象也可以用作工厂或委托的参数。

示例

考虑以下代码片段:

<code class="language-csharp">namespace SO2719954
{
    class Base { }
    class Descendant : Base { }

    interface IBibbleOut<out T> { }
    interface IBibbleIn<in T> { }

    class Program
    {
        static void Main(string[] args)
        {
            // 协变示例
            IBibbleOut<Base> b = GetOutDescendant(); // IBibbleOut<Descendant> 赋值

            // 逆变示例
            IBibbleIn<Descendant> d = GetInBase(); // IBibbleIn<Base> 赋值
        }

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

在此示例中,接口IBibbleOut<out T>是协变的,允许b引用Descendant对象;接口IBibbleIn<in T>是逆变的,允许d引用Base对象。

以上是协变和逆变如何增强 C# 中的接口使用?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn