C#中的协变OUT和逆变

泛型接口和泛型委托中经常使用可变性

 in  逆变,out  协变

 

从 list<string>转到list<object> 称为协变 (string 从object 派生,那么 string 转成object 是合理的,子类替换父类是合理的,)

从list<object> 转到 list<string> 称为逆变 (经object 转成string ,将父类转成子类,是不合理的,称为逆变)

1.逆变代码掩饰

复制代码
复制代码
  static void Main(string[] args)
        {
            ICovariant<Object> iobj = new Sample<Object>();
            ICovariant<String> istr = new Sample<String>();

            // You can assign istr to iobj because
            // the ICovariant interface is covariant.
           // iobj = istr;
            istr = iobj; //从 object 类型转成string 类型,父类转成子类 则是逆变
            Console.ReadLine();
        }

        // Covariant interface.
        interface ICovariant<in R> { }

        // Extending covariant interface.
        interface IExtCovariant<in R> : ICovariant<R> { }

        // Implementing covariant interface.
        class Sample<R> : ICovariant<R> { }
复制代码

 

复制代码

2.协变演示

复制代码
   static void Main(string[] args)
        {
            ICovariant<Object> iobj = new Sample<Object>();
            ICovariant<String> istr = new Sample<String>();

            // You can assign istr to iobj because
            // the ICovariant interface is covariant.
           // iobj = istr;
            iobj = istr; //从 string类型转成object类型,子类型转成父类  (里氏替换原则)  则是协变
            Console.ReadLine();
        }

        // Covariant interface.
        interface ICovariant<out R> { }

        // Extending covariant interface.
        interface IExtCovariant<out R> : ICovariant<R> { }

        // Implementing covariant interface.
        class Sample<R> : ICovariant<R> { }
复制代码

 

posted @   甜菜波波  阅读(500)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示