InBlock.gif委托的协变:
InBlock.gifclass Phone
InBlock.gif        {
InBlock.gif
InBlock.gif        }
InBlock.gif        class Mobile : Phone
InBlock.gif        {    
InBlock.gif
InBlock.gif        }
InBlock.gif        delegate Phone PhoneDele();
InBlock.gif        class Program
InBlock.gif        {
InBlock.gif                static void Main(string[] args)
InBlock.gif                {
InBlock.gif                        Program pro = new Program();
InBlock.gif                        PhoneDele pd1 = pro.GetPhone;
InBlock.gif                        PhoneDele pd2 = pro.GetMobile;
InBlock.gif                }
InBlock.gif
InBlock.gif                public Phone GetPhone()
InBlock.gif                {
InBlock.gif                        return null;
InBlock.gif                }
InBlock.gif
InBlock.gif                public Mobile GetMobile()
InBlock.gif                {
InBlock.gif                        return null;
InBlock.gif                }
InBlock.gif        }
委托pd2的返回类型为Phone(父类),GetMobile的返回类型为Mobile(子类),将Mobile(子类)类型的返回值赋给Phone(父类),称为协变。
InBlock.gif委托的逆变:
InBlock.gifclass Phone
InBlock.gif        {    
InBlock.gif
InBlock.gif        }
InBlock.gif        class Mobile : Phone
InBlock.gif        {    
InBlock.gif
InBlock.gif        }
InBlock.gif        delegate Phone PhoneDele(Mobile pho);
InBlock.gif        class Program
InBlock.gif        {
InBlock.gif                static void Main(string[] args)
InBlock.gif                {
InBlock.gif                        Program pro = new Program();
InBlock.gif                        PhoneDele pd1 = pro.SetPhone;
InBlock.gif                        PhoneDele pd2 = pro.SetMobile;
InBlock.gif
InBlock.gif                }
InBlock.gif
InBlock.gif                public Phone SetPhone(Phone pho)
InBlock.gif                {
InBlock.gif                        return null;
InBlock.gif                }
InBlock.gif
InBlock.gif                public Mobile SetMobile(Mobile mob)
InBlock.gif                {
InBlock.gif                        return null;
InBlock.gif                }
InBlock.gif        }
pd1的参数为Mobile类型,SetPhone的参数为Phone类型。实际该句还是将子类型传递给父类型。将类型为子类型Mobile的实际参数传递给类型为父类型Phone的形参,叫做逆变。
这样,看似类型为Phone的参数,实际为Mobile,看起来像装箱。
协逆变都是把子类型赋值给父类型的过程,都符合面向对象规则。
区别在于:1协变关注与返回值,逆变关注与参数;2协变是发生在方法最后对返回值的操作,逆变是发生在方法调用中间的对参数的操作。