从C# 4.0开始,泛型接口和泛型委托都支持协变和逆变,由于历史原因,数组也支持协变。里氏替换原则:任何基类可以出现的地方,子类一定可以出现。
协变(out)协变:即自然的变化,遵循里氏替换原则,表现在代码上则是任何基类都可以被其子类赋值,如Animal = Dog、Animal = Cat使用out关键字声明(注意和方法中修饰参数的out含义不同)被标记的参数类型只能作为方法的返回值(包括只读属性)在没有协变时:abstract class Animal {} class Dog : Animal {} class Cat : Animal {} interface IPoppable<T> { T Pop(); } class MyStack<T> : IPoppable<T> { private int _pos; private readonly T[] _data = new T[100]; public void Push(T obj) => _data[_pos ] = obj; public T Pop() => _data[--_pos]; } 以下代码是无法通过编译的var dogs = new MyStack<Dog>(); IPoppable<Animal> animals1 = dogs; // 此处会发生编译错误 Stack<Animal> animals2 = dogs; // 此处会发生编译错误 此时,我们如果需要为动物园饲养员新增一个输入参数为Stack<Animal>饲喂的方法,一个比较好的方法是新增一个约束泛型方法:class Zookeeper { public static void Feed<T>(IPoppable<T> animals) where T : Animal {} } // 或者 class Zookeeper { public static void Feed<T>(Stack<T> animals) where T : Animal {} } // Main Zookeeper.Feed(dogs);现在,C#增加了协变使IPoppable<T>接口支持协变// 仅仅增加了一个 out 声明 interface IPoppable<out T> { T Pop(); } 简化Feed方法class Zookeeper { public static void Feed(IPoppable<Animal> animals) {} } // Main Zookeeper.Feed(dogs); 协变的天然特性——仅可作为方法返回值,接口(或委托)外部无法进行元素添加,确保了泛型类型安全性,所以不用担心Dog的集合中出现Cat常用的支持协变的接口和委托有:IEnumerableIEnumeratorIQueryableIGrouping<out TKey, out TElement>Func等共17个Converter<in TInput, out TOutput>IEnumerable<Dog> dogs = Enumerable.Empty<Dog>(); IEnumerable<Animal> animals = dogs; var dogList = new List<Dog>(); IEnumerable<Animal> animals = dogList;另外,由于历史原因,数组也支持协变,例如var dogs = new Dog[10]; Animal[] animals = dogs; 但是无法保证类型安全性,以下代码可正常进行编译,但是运行时会报错animals[0] = new Cat(); // 运行时会报错逆变(in)逆变:即协变的逆向变化,实质上还是遵循里氏替换的原则,将子类赋值到基类上使用in关键字声明被标记的参数类型只能作为方法输入参数(包括只写属性)例如:abstract class Animal {} class Dog : Animal {} class Cat : Animal {} interface IPushable<in T> { void Push(T obj); } class MyStack<T> : IPushable<T> { private int _pos; private readonly T[] _data = new T[100]; public void Push(T obj) => _data[_pos ] = obj; public T Pop() => _data[--_pos]; } // Main var animals = new MyStack<Animal>(); animals.Push(new Cat()); IPushable<Dog> dogs = animals; dogs.Push(new Dog()); 逆变的天然特性——仅可作为方法输入参数,接口(或委托)无法进行元素获取,即只能将子类赋值到父类上,进而保证了类型安全性。另外,常用支持逆变的接口和委托有:IComparerIComparableIEqualityComparerAction等共16个PredicateComparisonConverter<in TInput, out TOutput>
Action<Animal> animalAction = new Action<Animal>(a => { });Action<Dog> DogAction = animalAction;
作者:xiaoxiaotank
出处:https://www.cnblogs.com/xiaoxiaotank/
c语言如何写欧姆定律并计算(的协变和逆变吗)
2024-11-22 12:24:28 作者:滒颩采畩舊 网址:https://m.xinb2b.cn/know/muf456007.html
- 电脑几分钟后自动重启(您的电脑将在一分钟后自动重启)
- 2024-11-22您的电脑将在一分钟后自动重启今天有客户咨询大叔,WIN10的系统一开机就提示这个:您的电脑将在一分钟后自动重启,这个问题该如何解决呢?其实这个故障很好解决,这个问题呢就是TGP的加速功能修改了系统的网络设备,导致WIN10系统出。
- 故事国王和猫(故事汇Animals动物)
- 2024-11-22故事汇Animals动物Therearemanykindsofanimalsintheworld.Peopledon’tknowtheexactnumbers.世界上有许多钟动物,人们不知道它们确切的数目Inthezoo,p。
- 山东省省属事业单位待遇(省属鲁企人事制度改革密集推进)
- 2024-11-22省属鲁企人事制度改革密集推进经济导报记者王伟国企用人“能上不能下”长期饱受诟病,山东省属企业人事制度改革密集推进6月7日,山东两家省属企业——山东省港口集团有限公司和山东银座汽车有限公司同时发布职业经理人招聘公告,前者为直属企业。
- 菊花有几种品种介绍(菊花年年开年年不一样)
- 2024-11-22菊花年年开年年不一样北京日报客户端|实习记者何蕊又是一年金秋时节,北京街头巷尾、公园广场随处可见秋菊绽放的身影作为北京市花之一,菊花就像一张张靓丽的“名片”,在京华大地上争相开放懂菊的市民也许会发现,菊花虽年年开,却年年。
- 迈腾钥匙如何换电池(迈腾钥匙换电池)
- 2024-11-22迈腾钥匙换电池看好你电池型号,买几块电池,我这五块11块!把钥匙取出来,侧面拿东西一撬,往前一推就开了,换上新电池OK了,。
- 南极人纸尿裤怎么样?热销大牌纸尿裤测评
- 2024-11-22南极人纸尿裤怎么样?热销大牌纸尿裤测评双十一马上来袭,宝爸宝妈是时候在囤货之前做点功课了《消费者报道》测试了小鹿叮叮、南极人、全棉时代、Moony、马应龙、好奇、雀氏、花王、游乐园等9款纸尿裤9款测试产品大合照测评指标渗透性能(滑渗量、回。
- 廉政小故事(廉政格言警句)
- 2024-11-22廉政格言警句廉政小故事:(1)手好不要钱清乾隆进士王杰为人刚直敢言,不附权贵当时和坤在朝中专权,大臣都不去得罪他惟王杰每每与其据理力争有一次,议政完毕,和坤有意戏弄王杰,拉着他的手说:“好白嫩的手啊!”王杰正颜厉。
- 隔空互动(千里之外的同屏互动)
- 2024-11-22千里之外的同屏互动2020年是决胜全面小康、决战脱贫攻坚的收官之年,也是华南师范大学对口帮扶西藏林芝市建设“教育部中小学教师信息技术应用能力提升工程创新培训平台”的第三年及收官之年在这关键节点,11月9日至13日,平台。
- 这种菜全身都是宝很多人却不懂吃(体重减轻了还能不亏嘴)
- 2024-11-22体重减轻了还能不亏嘴快手又美味的家常菜,不亏嘴又减体重,春季要吃,女人要吃春暖花开季,一些明星减肥上了热门,身材窈窕确实令人羡慕她们都有一套自己的减肥食谱,素人的我们,我的减肥之路很平常,时间稍长些,减肥慢点这都不是事,。
- 好用的眼霜可以去除眼袋吗(涂眼霜真的能去眼袋吗)
- 2024-11-22涂眼霜真的能去眼袋吗对于大多数办公室女孩来说,个刻也离不开电脑的工作,被报刊和影视光碟占据的休闲时光,再加上越来越长时间地使用暖气、空调,这样的生活令眼部肌肉疲劳不堪,也许在25岁之前,皱纹就早早地来和你见面了眼霜就成为。
- 梦见建房(梦见建房的含义)
- 2024-11-22梦见建房的含义梦见自己家中盖房子,预示着获得重生,一切将变得十分的美好,大吉大利的梦见亲戚家盖房子,预示着身体会十分的健康女人梦见自己盖房子,预示着你的运势将逐渐变好,建议提前做好应对的准备,这样才能在运势最好的时。
- 全国舞剧优秀展演(原创冰上舞剧踏冰逐梦亮相)
- 2024-11-22原创冰上舞剧踏冰逐梦亮相流畅优雅的花样滑冰、活力动感的精彩舞蹈、感人肺腑的故事情节、惊险刺激的高难杂技、科技感十足的影像艺术……很难想象如此丰富的艺术元素都集中在同一场演出之中,并且全部在冰面上进行1月20日,由花样滑冰世界。