您的位置:首页 > 编程语言 > C#

C# 委托之协变和逆变

2012-11-06 16:03 405 查看

C# 委托之协变和逆变

MSDN: 协变

当委托方法的返回类型具有的派生程度比委托签名更大时,就称为协变委托方法。因为方法的返回类型比委托签名的返回类型更具体,所以可对其进行隐式转换。这样该方法就可用作委托。

协变使得创建可被类和派生类同时使用的委托方法成为可能。

看看下面的代码,Test1Handler只是要求返回Base类型对象即可,而Test1方法返回Derived类型对象。由于Derived继承自Base,自然可以进行隐性转换,因此这种委托方法是被允许的。这样的方式就叫协变。

改一下MSDN的表达方式:

当委托方法(Test1)的返回类型(Derived)直接或间接继承自委托签名(Test1Handler)的返回类型(Base)时,就称为协变委托方法。因为委托方法(Test1)的返回类型(Derived)可以隐式转换为委托签名(Test1Handler)的返回类型(Base)。这样该方法就可用作委托。

class Program

    {       

        public static Derived Test1()

        {

            Console.Write("协变");

            Console.ReadKey();

            return new Derived();

        }

        static void Main(string[] args)

        {

            // 协变

            Test1Handler t1 = Test1;// new Test1Handler(Test1);

            Base b = t1();

        }

    }

    public class Base { }

    public class Derived : Base { }

    public delegate Base Test1Handler();   

 

 

 

MSDN: 逆变

当委托方法签名具有一个或多个参数,并且这些参数的类型派生自方法参数的类型时,就称为逆变委托方法。因为委托方法签名参数比方法参数更具体,因此可以在传递给处理程序方法时对它们进行隐式转换。

这样逆变使得可由大量类使用的更通用的委托方法的创建变得更加简单。

在下面的代码中,传递给t2的是继承自Base的Derived对象,自然在执行Test2(t2)时可以自动隐性转换为Base类型,并不会出现转换错误。这样的方式就是逆变了。

改一下MSDN的表达方式:

当委托签名(Test2Handler)的参数类型(Derived)继承自委托方法(Test2)参数类型(Base)时,就称为逆变委托方法。因为在调用委托(t2)时可以隐式将传递的参数类型(Derived)转换为委托方法(Test2)所需的参数类型(Base)。

class Program

    {        

        

        static void Main(string[] args)

        {

            // 逆变

            Test2Handler t2 = Test2;// new Test2Handler(Test2);

            t2(new Derived());

           

        }

        private static void Test2(Base b)

        {

            Console.Write("逆变");

            Console.ReadKey();

        }

       

    }

    public class Base { }

    public class Derived : Base { }

    public delegate void Test2Handler(Derived d);  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: