07.C#泛型的限制和可空类型的简单说明(三章3.5-四章4.1)
自己在写文章的同时,也是在学习,对于书中的语句很多其实没有太好的理解,读一本书,要消化!!!三章都是讲泛型的,最后写一下泛型的限制,对于本章学习的完结,one end,one begin.
看下面的代码
1 public class Teacher 2 { 3 public enum Flag { Chinese, English }; 4 public string Name { get; set; } 5 } 6 7 public class ChineseTeacher : Teacher 8 { 9 Flag f = Flag.Chinese; 10 } 11 12 public class EnglishTeacher : Teacher 13 { 14 Flag f = Flag.English; 15 }
先来说下可变性,可变性分为协变性和逆变性。个人简单地理解为协变性作用于返回类型时,返回的对象符合签名中的返回类型,并进行向上转换,如一个方法返回一个Teacher对象,这时我们可以返回一个EnglishTeacher对象,因为EnglishTeacher类是从Teacher类继承的。或者签名表明要返回一个接口,则可以返回一个实现该接口的类的实例。而对于逆变性,则作用于参数的转递,如果一个方法接受一个Teacher对象作为参数,那可以传入一个ChineseTeacher对象。Teacher说我妥协了,你可以传入一个实现或者继承我的就行,不知理解是否正确,请指正。
1. 说下泛型吧,泛型不支持协变,如下面的代码将出错
1 List<Teacher> list = new List<ChineseTeacher> { 2 new ChineseTeacher(), 3 new EnglishTeacher() 4 };
list对象指向的是一个List<Teacher>列表,而在实际new的时候指向的是List<ChineseTeacher>列表,List<ChineseTeacher>到List<Teacher>,不知道能不能理解为协变?请指正。向一个List<ChineseTeacher>加入一个ChineseTeacher实例肯定是没错的,那向List<Teacher>加入一个EnglishTeacher对象肯定也是没错的,但向List<ChineseTeacher>加入一个EnglishTeacher对象肯定是不对,所以从上述的多义性可以看出泛型不支持协变性。
2.缺乏操作符约束或者"数值"约束
如我们在一个泛型方法中希望对泛型类实例进行操作符的运算是不起作用,且有BUG,在编译时则报错,而后续可以使用动态类型跳过编译阶段,等到执行阶段再作决策。
------------------------------------------------------------------------------------------------------------------------------------
鉴于只说泛型可以文章篇幅过短,当然也知道文章在精不在多,说下没有引用可空类型前,我们是如何表示一个"没有值"的值。
1.放弃一个值,用这个值表示"没有值",多人开发时,就好像指定errorCode:1表示服务器出错、errorCode:2表示用户不正确操作。
2.使用一个装饰引用类型包含一个值,设置一个bool类型的标记
3.与值属性相对的加入个bool类型的标记,与2的不同在于,3的方法在于在同一个类中,而2则是将值和标记封装成类,在使用值的类中加入封闭后类的实例。
三种方式的缺点不言而喻,输入过多的代码,不能重复使用,基于这个C#引入了可空类型。
请斧正。