• c#中的协变与逆变


    首先我们看一下msdn上关于这两个概念的说明:协变允许方法具有的派生返回类型比委托中定义的更多。逆变允许方法具有的派生参数类型比委托类型中的更少。

    不知道大家看到这两句话时是怎么理解的,反正我是没有理解清楚,于是放狗查了一下,最终我的理解是:

        这些变化是在一个大的原则下进行的,即给程序所需要的范围一个更大的范围。

    也许还是不清楚,来看一下小例子吧:

    namespace ConsoleApplication1
    {
        class Program
        {        
            static void Main(string[] args)
            {
                #region covariance test
                Func<object> covarianceTest1 = () => getObject();
                Func<object> covarianceTest2 = () => getString();
                #endregion
    
                #region contravariance test
                Action<string> contravarianceTest1 = obj => setObject(obj);
                Action<string> contravarianceTest2 = str => setString(str);
                #endregion
            }
    
            private static object getObject() { return null; }
            private static void setObject(object obj) { }
    
            private static string getString() { return null; }
            private static void setString(string str) { }
    
        }
    
    
    }
    

    以Func<object>为例,它是协变事例:covarianceTest2所需的返回类型是一个object类的,但我给它实例化后,确是一个更精确的类型string,这

    是好理解的。

    以Action<string>为例,它是逆变事例:contravarianceTest1所需的参数类型是一个string类的,但我给它实例化后,确是一个范围更大的类型object。

    所有这些都是ms在定义这门语言时设计的,你可以把它当成一个语法记下来。在c#4.0中还专门引进了in, out对这些变化进行处理。如果想理解更加彻底请看下面这两篇围脖吧!

    http://hestia.typepad.com/flatlander/2008/12/c-covariance-and-contravariance-by-example.html

    http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx

  • 相关阅读:
    java跳过构造方法新建对象
    java实现类似qq的窗口对聊
    NoSql的产生
    C语言跳出循环
    C语言for循环
    C语言while语句
    C语言条件运算符
    C语言switch语句
    C语言逻辑运算符
    C语言关系运算符
  • 原文地址:https://www.cnblogs.com/tingchen/p/1912977.html
Copyright © 2020-2023  润新知