自己在写文章的同时,也是在学习,对于书中的语句很多其实没有太好的理解,读一本书,要消化!!!三章都是讲泛型的,最后写一下泛型的限制,对于本章学习的完结,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. 工作总结 无法确定条件表达式的类型,因为“&lt;null&gt;”和“System.DateTime”之间没有隐式转换 解决办法 object——Nullable&lt;T&gt; (可空类型)

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

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

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

  7. 细说可空类型 nullable PropertyType

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

  8. 四、可空类型Nullable&lt;T&gt;到底是什么鬼

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

  9. C#可空类型

    C#创建可空类型对于有些可选类型的时候特别好用.创建可空类型用法直接上图. 执行效果 用法 运行效果

随机推荐

  1. 抓包利器Fiddler

    1).Fiddler安装 a.下载地址: http://fiddler2.com/get-fiddler b.安装:省略(下一步...下一步即可) 2).Fiddler配置 a.允许远程计算机连接Fi ...

  2. 如何更新Android SDK和Build Tool

    1. 运行命令 android 2. 勾选并安装需要的版本 3. 完成!

  3. Jenkins integration for AngularJS code coverage

    Install Jenkins plugins 'Cobertura' and 'HTML Publisher' 1. add Post-build Actions "Publish HTM ...

  4. == 与 is

    Python中的对象包含三要素:id.type.valueid:用来唯一标识一个对象: type:标识对象的类型: value是对象的值. ==是判断对象的值是否相等,也就是value,is是判断对象 ...

  5. vs2005编译QT4.5版本

    1. 下载代码:qt-win-opensource-src-4.5.02. 设置环境变量 Add to PATH: ‘;%QTDIR%/bin’3. 输入cmd,启动到vs2005安装目录下,进入Mi ...

  6. [MFC美化] MFC界面UI库总结

    稍微说下自己用过的感受: 1.SkinMagic 动态库DLL使用,(有VC6版本的静态链接库,没能成功调用).对控件:菜单和下拉框(下拉滚动条)有问题.不能自由设置颜色背景 皮肤格式:.smf,可使 ...

  7. Chapter 2 Open Book——2

    It was worse because I was tired; 更糟糕的是因为我疲惫了. I still couldn't sleep with the wind echoing around t ...

  8. CCSpriteBatchNode中存放元素的一点理解

    该对象只能包含基于CCSprite的对象,并且该要求适用于一切子孙对象.即加入CCSpriteBatchNode的任何对象都必须是CCSprite或其子类. 比如CCSpriteBatchNode包含 ...

  9. &ldquo;史上更难就业季&rdquo;暴露出啥隐情?

      如果说,2013年中国高校毕业生达到699万,被称为"史上最难就业季".那么2014年将成为去年之后的"更难就业季".据最新资料显示,2014年应届大学毕业 ...

  10. [CQOI2017]小Q的棋盘

    题解: 好像有题解说可以贪心.. 显然这是一棵树,考虑树形dp 维护f[i][j]从点i往下走j再回来经过的最多点,g[i][j]从点i往下走j不用回来经过的最多点 转移方程还是挺显然的,枚举的时候像 ...