那些年搞不懂的术语、概念:协变、逆变、不变体
发布时间:2016-10-30 20:20:52 所属栏目:教程 来源:站长网
导读:副标题#e# 简述什么是协变性、逆变性、不变性 协变性,如:string-object (子类到父类的转换) 逆变性,如:object-string (父类到子类的转换) 不变性,基于上面两种情况,不可变。具体下面再做分析。 泛型委托的可变性 先使用框架定义的泛型委托Func和A
C#4.0之前 IEnumerable<T> 、 IComparable<T> 、 IQueryable<T> 等接口都不支持可变性,在4.0及之后才支持。因为4.0之前定义的泛型接口没有添加out、in关键字,有兴趣可以切换版本看看。 延伸思考为什么in[输入参数]就只能逆变?分析如下: // 人 public class People { } //老师(继承People[人]) public class Teacher : People { //薪水 public decimal Salary { get; set; } } //运动 public interface IMotion<in T> { void Match(T t); } //跑步 public class Run<T> : IMotion<T> { public void Match(T t) { //假设中间有很多逻辑..... } } 为什么out[返回值]只能协变?分析如下: // 人 public class People { } //老师(继承People[人]) public class Teacher : People { //薪水 public decimal Salary { get; set; } } //运动 public interface IMotion<out T> { T Show(); //void Match(T t); } //跑步 public class Run<T> : IMotion<T> { public T Show() { return default(T); } //public void Match(T t) //{ // //假设中间有很多逻辑..... / |