vb.net协变和逆变 c# 逆变和协变

逆变和协变到底有什么区别关于协变和逆变要从面向对象继承说起 。继承关系是指子类和父类之间的关系;子类从父类继承所以子类的实例也就是父类的实例 。比如说Animal是父类,Dog是从Animal继承的子类;如果一个对象的类型是Dog,那么他必然是Animal 。
协变逆变正是利用继承关系 对不同参数类型或返回值类型 的委托或者泛型接口之间做转变 。我承认这句话很绕 , 如果你也觉得绕不妨往下看看 。
如果一个方法要接受Dog参数 , 那么另一个接受Animal参数的方法肯定也可以接受这个方法的参数,这是Animal向Dog方向的转变是逆变 。如果一个方法要求的返回值是Animal,那么返回Dog的方法肯定是可以满足其返回值要求的,这是Dog向Animal方向的转变是协变 。
VB.NET和C#逐层横向对比[2]//函数层
VB支持局部Static变量
C#不支持
VB支持数组的最后一唯大小可变
C#的数组大小不能改变
VB的Try Catch语句支持Exit Try直接进入Finally
C#无类似语句
VB的Catch可以带When子句 使用 NET的异常filter功能有选择的进行捕获
C#完全不支持这一功能
VB可以使用传统的On Error方法 非结构化地处理异常C#仅支持结构化
C#支持使用checked语句暂时打开或关闭整数溢出检查
【vb.net协变和逆变 c# 逆变和协变】 VB仅支持整个项目级别处理
VB支持使用函数名作为返回变量 也支持Return
C#只支持Return
VB的Try Using For For Each等语句支持使用前边定义的变量
C#的对应语句只能在语句开始处定义
C#可以支持unsafe语法有限地支持指针和stack数据的访问
VB不支持
C#支持yield return语法的迭代器生成
VB不支持
C#支持delegate语句就地生成支持closure的匿名方法
VB不支持
C#支持在委托与方法结合的过程中使用协变和反边规则
VB则只能使用完全匹配规则
VB和C#的循环和分支有若干次要差别
C#支持nullable类型的运算符跨类型支持
VB需要手工完成同样功能
VB支持用实例访问类的静态成员
C#只支持类明访问
VB支持按照非虚函数的规则 调用自身类型定义的一个虚函数
C#不支持这一功能
类库层
VB有一个非常好用Microsoft VisualBasic dll 实现了许多帮助函数 Application Framework应用程序框架 My命名空间等C#只能望眼欲穿了……
C#以out/ref或者大小写区分不同函数 这就是不符合CLS的
VB的每个特性几乎都是CLS兼容的(即使是那些C#不支持的) 在VB中使用不会从根本上影响到与C#的交互
lishixinzhi/Article/program/net/201311/15508
.NET 关于泛型的协变和逆变中 in / out 两个参数(或者方法) 的使用方法和什么时候需要使用 。求例子 。用来表明传入传出参数的,比如IEnumerable的Current的T就是一个out,这样IEnumerablestring就可以赋值给IEnumerableobject,因为Current是一个取值的属性(输出 out)所以使用object引用子类string是没问题的 。
而in表明输入参数 , 比如IComparer的Compare接受两个T的参数标明为in,这样ICompareobject可以传给IComparestring,因为string是object的子类,所以ICompareobject的Convert方法的object参数可以引用被当作IComparestring而传入的string类型的参数,string是object的子类 。
如果你不理解那就不用关心了,因为这种协变逆变的高级功能只有等你需要的时候才能理解 。
什么是协变, 逆变?java中协变跟逆变是对泛型类的继承关系的表述.
如:
ListNumber和 ListInteger之间是没有继承关系的.
但是直观上会觉得,Integer是 Number的子类, 所以 ListInteger应是 ListNumber的子类.

推荐阅读