好贷网好贷款

C#中的协变与逆变

发布时间:2016-12-5 12:33:45 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"C#中的协变与逆变",主要涉及到C#中的协变与逆变方面的内容,对于C#中的协变与逆变感兴趣的同学可以参考一下。

一、赋值兼容性规则 C#中基类可以兼容派生类对象,例如object obj=String.Empty; 二、泛型接口的协变 假设有如下几个类 class Base{} class Derived1 : Base{} class Derived2 : Base{} 以及泛型接口 ICovariant<out T> {         Function(out T);  (1) 不合法      T Function();           (2) } 由于ICovariant接口支持协变,所以以下赋值语句合法 ICovariant<Base> base=null; ICovariant<Derived1> derived1=null; ICovariant<Derived2> derived2=null; base=derived1; Base base1=base.Function();  //合法 那为什么out参数只能作为输出不能作为输入呢? 假设注释掉上面的(2)行,那么现在base.Function(derived2)看起来似乎是合法的,因为Base类型的方法参数可以兼容Derived2类型的对象,但是运行时会出现类型不安全的问题,因为实际上此时的base对象中的Function必须接受的是Derived1类型的参数,所以从Derived2往Derived1转换回出现错误。 这就是为什么out参数只能最为输出不能作为输入。 三、泛型接口的逆变 同样假设有如下几个类 class Base{} class Derived1 : Base{} class Derived2 : Base{} 以及泛型接口 IContravariant<in T> {         Function(in T);  (1)       T Function();        (2) } 由于IContravariant 接口支持协变,所以以下赋值语句合法 IContravariant<Base> base=null; IContravariant<Derived1> derived1=null; IContravariant<Derived2> derived2=null; derived1=base;   //此时Base类对象可以往Derived1类型转换,此谓逆变! Derived1 error=derived1.Function(); //不合法 那为什么in参数只能作为输入不能作为输出呢? 假设取消上面注释掉(1)行,那么现在Dervied1 error=derived1.Function(); 就会出错,因为此时实际上把base.Function()中返回的Base类对象强迫赋值给Derived1类型的对象,不符合最开始所说的赋值兼容性规则。

上一篇:Acitivity的生命周期
下一篇:java中synchronized用法(一)

相关文章

相关评论