协方差和逆变现实世界的例子

协方差和逆变现实世界的例子

我在理解如何在现实世界中使用协方差和逆变时遇到了一些麻烦。

到目前为止,我见过的唯一例子是同样的旧数组示例。

object[] objectArray = new string[] { "string 1", "string 2" };

很高兴看到一个允许我在开发过程中使用它的例子,如果我能看到它在其他地方使用的话。


吃鸡游戏
浏览 372回答 3
3回答

茅侃侃

// Contravarianceinterface IGobbler<in T> {&nbsp; &nbsp; void gobble(T t);}// Since a QuadrupedGobbler can gobble any four-footed// creature, it is OK to treat it as a donkey gobbler.IGobbler<Donkey> dg = new QuadrupedGobbler();dg.gobble(MyDonkey());// Covarianceinterface ISpewer<out T> {&nbsp; &nbsp; T spew();}// A MouseSpewer obviously spews rodents (all mice are// rodents), so we can treat it as a rodent spewer.ISpewer<Rodent> rs = new MouseSpewer();Rodent r = rs.spew();为了完整......// Invarianceinterface IHat<T> {&nbsp; &nbsp; void hide(T t);&nbsp; &nbsp; T pull();}// A RabbitHat…IHat<Rabbit> rHat = RabbitHat();// …cannot be treated covariantly as a mammal hat…IHat<Mammal> mHat = rHat;&nbsp; &nbsp; &nbsp; // Compiler error// …because…mHat.hide(new Dolphin());&nbsp; &nbsp; &nbsp; // Hide a dolphin in a rabbit hat??// It also cannot be treated contravariantly as a cottontail hat…IHat<CottonTail> cHat = rHat;&nbsp; // Compiler error// …because…rHat.hide(new MarshRabbit());cHat.pull();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Pull a marsh rabbit out of a cottontail hat??

守着星空守着你

这是我放在一起帮助我理解差异的原因public&nbsp;interface&nbsp;ICovariant<out&nbsp;T>&nbsp;{&nbsp;}public&nbsp;interface&nbsp;IContravariant<in&nbsp;T>&nbsp;{&nbsp;}public&nbsp;class&nbsp;Covariant<T>&nbsp;:&nbsp;ICovariant<T>&nbsp;{&nbsp;}public&nbsp;class&nbsp;Contravariant<T>&nbsp;:&nbsp;IContravariant<T>&nbsp;{&nbsp;}public&nbsp;class&nbsp;Fruit&nbsp;{&nbsp;}public&nbsp;class&nbsp;Apple&nbsp;:&nbsp;Fruit&nbsp;{&nbsp;}public&nbsp;class&nbsp;TheInsAndOuts{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;Covariance() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ICovariant<Fruit>&nbsp;fruit&nbsp;=&nbsp;new&nbsp;Covariant<Fruit>(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ICovariant<Apple>&nbsp;apple&nbsp;=&nbsp;new&nbsp;Covariant<Apple>(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Covariant(fruit); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Covariant(apple);&nbsp;//apple&nbsp;is&nbsp;being&nbsp;upcasted&nbsp;to&nbsp;fruit,&nbsp;without&nbsp;the&nbsp;out&nbsp;keyword&nbsp;this&nbsp;will&nbsp;not&nbsp;compile &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;Contravariance() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IContravariant<Fruit>&nbsp;fruit&nbsp;=&nbsp;new&nbsp;Contravariant<Fruit>(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IContravariant<Apple>&nbsp;apple&nbsp;=&nbsp;new&nbsp;Contravariant<Apple>(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Contravariant(fruit);&nbsp;//fruit&nbsp;is&nbsp;being&nbsp;downcasted&nbsp;to&nbsp;apple,&nbsp;without&nbsp;the&nbsp;in&nbsp;keyword&nbsp;this&nbsp;will&nbsp;not&nbsp;compile &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Contravariant(apple); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;Covariant(ICovariant<Fruit>&nbsp;fruit)&nbsp;{&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;Contravariant(IContravariant<Apple>&nbsp;apple)&nbsp;{&nbsp;}}tldrICovariant<Fruit>&nbsp;apple&nbsp;=&nbsp;new&nbsp;Covariant<Apple>();&nbsp;//because&nbsp;it's&nbsp;covariantIContravariant<Apple>&nbsp;fruit&nbsp;=&nbsp;new&nbsp;Contravariant<Fruit>();&nbsp;//because&nbsp;it's&nbsp;contravariant
打开App,查看更多内容
随时随地看视频慕课网APP