从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 11:20:19 作者:滒颩采畩舊 网址:https://m.xinb2b.cn/sport/muf456007.html
- 张耀扬电影镜头合集(张耀扬少有的悲情英雄电影)
- 2024-11-22张耀扬少有的悲情英雄电影1996年公映的“古惑仔”系列电影前3集,捧红了郑伊健、陈小春等一众演员,也让张耀扬在很长一段时间内,成为了香港电影里,“乌鸦哥”这类角色的代言人但你知道吗?除了这类嚣张跋扈的古惑仔角色,张耀扬还曾塑。
- 车险免费补漆靠谱吗(补车漆5次花900来年车险多交2000)
- 2024-11-22补车漆5次花900来年车险多交2000在人们买车之后,4S店就会建议车主为汽车购买车险,这样在发生意外之后也能挽回一定的是损失现在人们的安全意识也比较强,对于车险也能接受,并且愿意为爱车购买一份保险,毕竟现在的交通状况太过复杂,就连老司机。
- 打麻风疫苗后发烧有小红点正常吗(麻风疫苗后发烧)
- 2024-11-22麻风疫苗后发烧因为之前蛋清过敏,后来又种种原因,麻风疫苗被推迟到宝宝15个月才补种,扎完针第五天、第六天体温为37.1或37.2左右,第六天傍晚6点半开始高烧,39.2,用了一个退热栓一个半小时退烧,一宿没有再烧,。
- 蒸汽眼罩小科普(蒸汽眼罩你还要)
- 2024-11-22蒸汽眼罩你还要新时代奋斗的“打工人”们每天都在长时间坚持做一件事以至于有些人表面上水灵水灵眼睛早就干得像萨拉哈沙漠了于是,沙雕网友们开始在夹缝中探索各种护眼模式把电脑屏幕调成“护眼”绿图源:网络快速转动眼球图片来源。
- 面条怎么做才能筋道爽口(面条怎么做好吃呢)
- 2024-11-22面条怎么做好吃呢除了米饭,面条想必是最受欢迎的主食了,甚至在北方的一些地方,面条比米饭更受欢迎,越是简单常见的食物想要做好越是不简单,要想面条怎么做好吃美味,也是有着一番讲究的面条怎么做好吃:老北京炸酱面食材的准备面。
- 好看的美剧动作战争片(MAX冷门佳作泪之谷)
- 2024-11-22MAX冷门佳作泪之谷HBOMAX最近上线了一部由以色列拍摄的战争题材迷你剧该剧虽然冷门,但在国外可以说口碑爆棚IMDb刚开分时,一度达到了9.7,目前也持续维持在9.1分之高国内目前看的人还比较少,在豆瓣上也有8.5的评。
- 穿越火线官方cg(穿越火线太欢乐了)
- 2024-11-22穿越火线太欢乐了有的电视剧就是太牛逼看着是一本正经组队打比赛的青春剧,但是却出人意料地笑点多多这么神仙的电视剧,说的就是最近十分火爆的#穿越火线改名大赛#的主角——电视剧《穿越火线》因为剧情有趣好玩,刚开始,一些网友。
- 夜间施工噪声需要提前多少天申请(春节工地控噪有规定)
- 2024-11-22春节工地控噪有规定两湖隧道东湖2标段项目工地现场长江日报大武汉客户端1月27日讯“工地春节期间合理安排工期,22:00至次日06:00不得施工”1月27日,武汉市城管执法督察总队发出通知,要求各区城管部门积极做好服务工。
- 现代文学作家作品赏析(现代文学作者及代表作)
- 2024-11-22现代文学作者及代表作九、现代文学作者及代表作1917年胡适和陈独秀在《新青年》上发表两篇文章为标志,1、新月派(1)胡适《尝试集》,是我国现代诗歌史上第一部新诗集(2)闻一多《红烛》《死水》(3)徐志摩《再别康桥》<。
- 五大道详细讲解(五大道)
- 2024-11-22五大道校媒记者杨子晴五大道在天津市中心城区的南部,东、西向并列着以成都、重庆、大理、睦南及马场为名的五条街道,是迄今中国保留最为完整的洋楼建筑群,天津人把它称作“五大道”五大道地区拥有上世纪二、三十年代建成。
- 燃油宝有没有必要加看了你就知道(揭秘燃油宝的真相)
- 2024-11-22揭秘燃油宝的真相现在卖燃油宝的很多,宣传的时候,往往把效果说得五花八门,“用1小瓶可以省油,提升动力”,甚至告诉你排出来的气,排气管都不会变黑了真的有这么神奇吗?为什么我用完好像就没什么感觉?今天我们来讲一下燃油宝不。
- 原神武器打造选谁好(武器攻略专武和伪专武)
- 2024-11-22武器攻略专武和伪专武武器攻略丨「神乐之真意」说起角色池子搭配我们会想起宵宫,因为每次up都赶上一神复刻那么说到武器我们就想到神乐铃了,首次up还是配绿剑,这次又是搭配暴击弓「冬极白星」在第一次up的时候咱们已经写过,那如。