当前位置: 代码迷 >> C# >> C#协变跟逆变
  详细解决方案

C#协变跟逆变

热度:99   发布时间:2016-05-05 04:07:13.0
C#协变和逆变

  我们知道在C#中,是可以将派生类的实例赋值给基类对象的。

  这是没有什么问题的。下面我们做一些变动。

协变

  Dog类不是继承Animal类么,为什么到这里就不能用了呢?

  原来我们都忽略了一点,在这段代码中dogMarker和animalMarker变量的类型分别是Factory<Dog>和Factory<Animal>他们是没有继承关系的,也就是他们是同级别的。因此我们把dogMarker赋值给animalMarker的时候编译器就报错了。那么我们如果希望上面的代码可以正常运行,那要怎么做呢?

  还记得在学习参数的时候有一个关键字么——out;如果类型参数只用作输出值的话,那么他适用于任何泛型委托。

  这种结构化的委托特效之间的关系就叫做协变。

逆变

同样先来看一段代码

  这次大家知道,报错肯定是类型不同当然不能赋值了,仔细看异常提示,要怎么实现“逆变”呢?其实只需要一个简单的关键字(in)就能解决了

这种在期望传入基类时允许传入派生类对象的特性就是逆变了。

小结

对于协变与逆变只适用于引用类型,因为值类型没法派生新的类型。

显式变化使用in和out关键字只适用于委托和接口,类、结构和方法都不适用。

  相关解决方案