自己在写文章的同时,也是在学习,对于书中的语句很多其实没有太好的理解,读一本书,要消化!!!三章都是讲泛型的,最后写一下泛型的限制,对于本章学习的完结,one end,one begin.

  看下面的代码

 public class Teacher
{
public enum Flag { Chinese, English };
public string Name { get; set; }
} public class ChineseTeacher : Teacher
{
Flag f = Flag.Chinese;
} public class EnglishTeacher : Teacher
{
Flag f = Flag.English;
}

  先来说下可变性,可变性分为协变性和逆变性。个人简单地理解为协变性作用于返回类型时,返回的对象符合签名中的返回类型,并进行向上转换,如一个方法返回一个Teacher对象,这时我们可以返回一个EnglishTeacher对象,因为EnglishTeacher类是从Teacher类继承的。或者签名表明要返回一个接口,则可以返回一个实现该接口的类的实例。而对于逆变性,则作用于参数的转递,如果一个方法接受一个Teacher对象作为参数,那可以传入一个ChineseTeacher对象。Teacher说我妥协了,你可以传入一个实现或者继承我的就行,不知理解是否正确,请指正。

  1. 说下泛型吧,泛型不支持协变,如下面的代码将出错

 List<Teacher> list = new List<ChineseTeacher> {
new ChineseTeacher(),
new EnglishTeacher()
};

  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#引入了可空类型。

  请斧正。

07.C#泛型的限制和可空类型的简单说明(三章3.5-四章4.1)的更多相关文章

  1. C#可空类型(转载)

    在程序开发中,有时候需要值类型也为可空类型,比如,在数据库中,我们可以把一个日期Datetime设置为null. 在C# 2.0中就出现了可空类型,允许值类型也可以为空(null),可空类型的实现基于 ...

  2. 泛型 System.Collections.Generic及泛型继承、运算符、结构、接口、方法、委托、事件、可空类型等

    一.定义泛型类 void Main() { //实例化泛型类时,才指定具体的类型 MyGenericClass<); Console.WriteLine(MyGeneri.InnerT1Obje ...

  3. C#基础知识系列二(值类型和引用类型、可空类型、堆和栈、装箱和拆箱)

    前言 之前对几个没什么理解,只是简单的用过可空类型,也是知道怎么用,至于为什么,还真不太清楚,通过整理本文章学到了很多知识,也许对于以后的各种代码优化都有好处. 本文的重点就是:值类型直接存储其值,引 ...

  4. C#2.0之可空类型

    可空类型Nullable<T> 在C#2.0之前 ,值类型一直不可以为null,但是实际开发中常常会有这样的需求,比如结束时间. 为什么不可以为null 对于引用类型来说,null代表着空 ...

  5. 工作总结 无法确定条件表达式的类型,因为“<null>”和“System.DateTime”之间没有隐式转换 解决办法 object——Nullable<T> (可空类型)

    可空值类型 备注     一种类型认为是可以为 null,如果它可以分配一个值,也可以分配null,这意味着类型具有无论如何没有值. 默认情况下,所有都引用类型,如String,是否可以为 null, ...

  6. [C#基础知识系列]专题十:全面解析可空类型[转]

    原文链接 主要内容: 1:空合并操作符(?? 操作符) ??操作符也就是"空合并操作符",它代表的意思是两个操作数,如果左边的数不为null时,就返回左边的数,如果左边的数为nul ...

  7. 细说可空类型 nullable PropertyType

    可空类型是System.Nullable结构体的实列.一个可空类型代表了相应值类型的正确范围附加null值.这么说来,其实也不是很明子,命题嘛,一般不求易懂,但求准确. 那我就来说说这可空类型吧,上次 ...

  8. C#可空类型知多少

    在项目中我们经常会遇到可为空类型,那么到底什么是可为空类型呢?下面我们将从4个方面为大家剖析. 1.可空类型基础知识 顾名思义,可空类型指的就是某个对象类型可以为空,同时也是System.Nullab ...

  9. 四、可空类型Nullable<T>到底是什么鬼

    值类型为什么不可以为空 首先我们都知道引用类型默认值都是null,而值类型的默认值都有非null. 为什么引用类型可以为空?因为引用类型变量都是保存一个对象的地址引用(就像一个url对应一个页面),而 ...

随机推荐

  1. 《精解Windows 10》

    <精解Windows 10>全面深入讲解Windows 10操作系统的使用方法.本书共计14章内容.第一章简述Windows 10操作系统的一些变革:第二章介绍Modern 2.0界面的体 ...

  2. JavaScript的函数重载

    java语言中函数的重载和重写可谓是很重要的概念,所以在写js的时候时不时的会想到这种用法,重写先不说,这里只说重载.. <script language="JavaScript&qu ...

  3. curl -x 127.0.0.1:80

    curl -x ip:80 +网址 就相当于在本地hosts文件指定一个域名,具有优先访问权.(curl -x 127.0.0.1:80这个方法适用于生产环境的服务器来测试自己做为代理商访问是否正常) ...

  4. java lambda小纪

    一个通俗的说法是 :C#委托和Java中实现了 函数式编程的方法,它是函数式编程中的概念,为了更快的处理集合,在Java,c#等静态类型语言中想要引用一个函数的一种方式,(实现了通过封装匿名方法来达到 ...

  5. codeforces 712A A. Memory and Crow(水题)

    题目链接: A. Memory and Crow time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  6. Unity制作FPS Demo

    等到把这个Unity FPS Demo[僵尸杀手]完成后再详细补充一下,使用Unity制作FPS游戏的经历,今天做个标识.

  7. java22 - 1 多线程之 单线程和多线程的图解

  8. 后台首页品字形(frameset)框架搭建

    get_defined_constants([true])//显示所有常量信息.参数true,表示分组显示,查看当前系统给我提供了哪些常量可以使用,包括自定义常量. __CONTROLLER__//获 ...

  9. 正则基础之——环视(Lookaround)

    环视基础 环视只进行子表达式的匹配,不占有字符,匹配到的内容不保存到最终的匹配结果,是零宽度的.环视匹配的最终结果就是一个位置. 环视的作用相当于对所在位置加了一个附加条件,只有满足这个条件,环视子表 ...

  10. 总结Gerrit常用命令

    查看分支列表,带有*的分支表示是当前所在分支[root@115~~]#git branch 查看分支详细情况 (推荐这种方式)[root@115~~]#git branch -av 创建分支(比如de ...