c语言如何写欧姆定律并计算(的协变和逆变吗)
c语言如何写欧姆定律并计算(的协变和逆变吗)
2024-11-05 07:58:26  作者:滒颩采畩舊  网址:https://m.xinb2b.cn/know/muf456007.html

从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/

  • 当人家夸你上进努力你怎么回答(涨知识了当有人跟你说)
  • 2024-11-06涨知识了当有人跟你说今天Stone老师突然看到一个特别好玩的事看完这位同学的无奈后,我也感觉智商不够用了无奖抢答!各路大神来研究一下,这个苹果的”苹“还能组什么词呢?正好借着这个话题,今天Stone老师就来聊一聊“苹果”。
  • 三国演义关羽过五关斩九将(三国马后炮关羽篇)
  • 2024-11-06三国马后炮关羽篇视频:三国马后炮,关羽篇【玄铁说】最近刮起了一股国宝热,那我也想蹭蹭热度,聊聊国宝,但熟悉本铁的朋友都知道,我从不按套路出牌,所以今天咱们在聊国宝的同时,探讨一个问题,那就是,假如一个东西可能不存在,。
  • 被翻唱最多的华语歌曲(华语乐坛最难翻唱的歌曲)
  • 2024-11-06华语乐坛最难翻唱的歌曲华语乐坛公认最难翻唱的神曲是哪首歌?如果再给萧敬腾一次机会,相信他一定不会再挑战这首《男儿当自强》!一首尽显男子气概的歌曲,在他的演绎之下,竟然被唱出了一丝妩媚的气息,尤其是高音部分的娇喘声,简直让人。
  • 游戏封神怎么玩(游戏上古封神攻略)
  • 2024-11-06游戏上古封神攻略【游戏类型】角色扮演游戏状态《上古封神》是一款3D游戏游戏特点1、超大规模阵营战场,炎黄和九黎的阵营战、攻城战,同屏500人人物还可以保持流畅运行2、多变法宝玩法,法宝炼化,幻化,轮回、繁殖、法宝技能。
  • 四不像哪四不像(四不像指的什么动物)
  • 2024-11-06四不像指的什么动物驯鹿也被叫作“索格召”而现在我们叫它“奥荣”它有着马一样的头,鹿一样的角,驴一样的身躯和牛一样的蹄子似马非马,似鹿非鹿,似驴非驴,似牛非牛,所以汉族人叫它“四不像”“四不像”—驯鹿我觉得它身上既有马头。
  • 1平方米等于多少米(这里有详细介绍)
  • 2024-11-06这里有详细介绍1平方米说的是面积,不是等于多少米的概念而平方米是面积单位边长为1米的正方形的面积被定义为1平方米,一块任意形状的平面的面积如果等效于边长为1米的正方形的面积也称为1平方米平方米(㎡,法文:mètre。
  • 新手养龟如何判断龟缸的好坏(养了这么久的龟龟)
  • 2024-11-06养了这么久的龟龟龟龟和我们人一样,也是有自己的器官,有眼睛,有鼻子等等不过龟龟的器官有些跟我们人体的器官大致的作用却是不一样的,今天我们就来说说龟龟身体上的器官都有些什么样的作用,大家一起来涨知识吧!1、鼻子其实准确。
  • 七夕本来不是情人节(七夕真不是情人节)
  • 2024-11-06七夕真不是情人节#七夕节#爱情不是请客吃饭,七夕也不是你以为的情人节……明天就是中国传统七夕节,但是不得不提醒大家:七夕不是情人节将七夕当情人节来过,估计连牛郎织女都会很不解七夕节起始于上古,普及于西汉,鼎盛于宋代。
  • 帝国时代4怎么跑商
  • 2024-11-06帝国时代4怎么跑商玩家可以用商人将重要资源点占领了,点下去有白色圈圈的,在那里点右键即可,一般在重要的资源上建个塔就行了跑商最大效率,就是单独用木墙围个小跑道,这样一来马车不会乱跑,二来,电脑总爱造几个兵偷你马车,很烦。
  • 街机玩家鲜为人知的格斗游戏(街机游戏史上最)
  • 2024-11-06街机游戏史上最相信提起街机格斗游戏,玩家们心中第一个想到的肯定是卡普空与SNK之间的两强争霸了,一个是街机“格斗游戏”这四个字的起源,而另一个则是让街机格斗游戏进入了属于自己的新时代可以说正是在他们的“明争暗斗”之。