协变和逆变

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值