zoukankan      html  css  js  c++  java
  • CLR 协变、逆变

    看书看得有点晕了,协变、逆变傻傻分不清楚。

    看到泛型和委托、委托方法,发现这里面的协变和逆变不一样。

    泛型的逆变和协变:
    如果某个返回类型可以由其基类替换,那么这个类型就是支持协变的。
    如果某个参数类型可以由其派生类替换,那么这个类型就是支持逆变的。

     参考:http://www.cnblogs.com/IPrograming/p/4471130.html

    示例代码如下:

    public class BaseClass
    {
        //...
    }
    
    public class DerivedClass : BaseClass
    {
        //...
    }
    IEnumerable<DerivedClass> d = new List<DerivedClass>();
    IEnumerable<BaseClass> b = d;
    //IEnumerable<T> 接口的定义(支持协变)
    public interface IEnumerable<out T> : IEnumerable

    委托方法的逆变和协变:

    如果某个返回类型可以由其派生类替换,那么这个类型就是支持协变的。
    如果某个参数类型可以由其基类替换,那么这个类型就是支持逆变的。

        public delegate object TestDelegate(string str);
    
        class MyClass
        {
            public string t1(string s)
            {
                return "";
            }
    
            public object t2(object s)
            {
                return "";
            }
    
            public string t3(object s)
            {
                return "";
            }
    
            public int t4(string s)//值类型不可以,只有引用类型支持协变和逆变
            {
                return 0;
            }
            public void main()
            {
                TestDelegate td1 = t1;
                TestDelegate td2 = t2;
                TestDelegate td3 = t3;
                TestDelegate td4 = t4;//编译报错,返回类型错误
            }
        }

    我现在也有点懵。

    个人看书及查的资料所得,如有错误,欢迎指正。

  • 相关阅读:
    天热了,心静了,四月过去了
    Boost编译一步步来
    战争又起
    waiting for the day
    游戏状态管理之C++实现
    匈牙利命名法之VB篇
    VB 实用函数集
    匈牙利命名法之简介
    Dxperience 安装总是不成功
    Developer Express DevExpress DXperience
  • 原文地址:https://www.cnblogs.com/dawenyang/p/7691277.html
Copyright © 2011-2022 走看看