C# 协变逆变

参考:https://mp.weixin.qq.com/s?__biz=MzAwNTMxMzg1MA==&mid=2654078229&idx=1&sn=32450d996fec373093e5ed47172d334e&chksm=80d82140b7afa856793291e04f299e151ea22a1920fdae01ee6275840ccd999897e89fa91d87&scene=126&sessionid=1589422816&key=1ff99ff738faa8e7973692eb095c38f6933495cb874fea0a00e45a740950b820fcfff78caa34fa10ed3d704bbc8aee6a969562bbab347dc75e092c4f158fff0c95ca95b80f9995c7594284b9c0e816b3&ascene=1&uin=MTE5Mzc3NTU0Mw%3D%3D&devicetype=Windows+7+x64&version=62090070&lang=zh_CN&exportkey=AS7sYsipEY%2FNTQn4mWmMb0w%3D&pass_ticket=9eT7eWsSsmUAUUsd3Q972jKor5pc18xAFSD2pW%2FQWwzl9q%2F52LVleq4sMYcjn0cn

 

协变

  1.定义接口时泛型参数T用out修饰,声明泛型接口,实现指向泛型参数的子类

  2.泛型参数T只能当方法的返回值,不允许当方法入参,否则就会出现实现时指向了子类1,但是方法入参却使用了子类2,虽然都继承自父类,但是却没有使用明确指向的子类1

 

逆变

  1.定义接口时泛型参数T用in修饰,声明泛型接口,实现指向泛型参数的父类

  2.泛型参数T只能当方法的入参,不允许当方法的返回值,如果允许的话那么就会出现返回参数的话可以是任意子类,而实际要求的泛型参数是父类

 

委托中的协变逆变

  委托的泛型参数天然支持协变逆变

  1.定义 delegate T GetValue<T>(); 天然支持协变,out参数可选

  2.定义 delegate void SetValue<T>(T);天然支持逆变,in参数可选

posted @ 2020-05-14 11:05  zyngdbwh  阅读(178)  评论(0)    收藏  举报