协变和逆变

来源:互联网 发布:mysql 表合集 编辑:程序博客网 时间:2024/05/01 13:43
using UnityEngine;using System.Collections;// Contravariant interface.interface IContravariant<in A> { }// Extending contravariant interface.interface IExtContravariant<in A> : IContravariant<A> { }// Implementing contravariant interface.class Sample<A> : IContravariant<A> { }public class AC{}public class BC:AC{}public class xb : MonoBehaviour {public delegate void DContravariant<in A>(A argument);// Methods that match the delegate signature.public static void SampleControl(AC control){ }public static void SampleButton(BC button){ }public void Tests(){// Instantiating the delegates with the methods.DContravariant<AC> dControl = SampleControl;DContravariant<BC> dButton = SampleButton;dControl (new AC());dButton (new BC());dControl (new BC());// You can assign dControl to dButton// because the DContravariant delegate is contravariant.dButton = dControl;//error://dControl = dButton;// Invoke the delegate.//参数必须与dButton定义的类型相同,否则会报错dButton(new BC()); }static void Test(){IContravariant<AC> iobj = new Sample<AC>();IContravariant<BC> istr = new Sample<BC>();// You can assign iobj to istr because// the IContravariant interface is contravariant.istr = iobj;//error: Assets/_Test/xb.cs(39,17): error CS0266: Cannot implicitly convert type `IContravariant<BC>' to `IContravariant<AC>'. An explicit conversion exists (are you missing a cast?)//iobj = istr; AC ac = new AC ();BC bc = new BC ();ac = bc;//error:annot implicitly convert type `AC' to `BC'. An explicit conversion exists (are you missing a cast?)//ac = bc;}}



泛型接口:子类实现的泛型接口指向父类实现的泛型接口需逆变(in),父类实现的接口指向子类实现的接口需协变(out)

泛型委托:子类泛型委托变量指向父类泛型委托变量需逆变,父类委托指向子类委托需协变(貌似无法协变)

0 0
原创粉丝点击