自己在写文章的同时,也是在学习,对于书中的语句很多其实没有太好的理解,读一本书,要消化!!!三章都是讲泛型的,最后写一下泛型的限制,对于本章学习的完结,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. 虚拟机Linux----Ubuntu1204----安装jdk1.8

    1.介绍 这里主要讲一下,如何在Ubuntu1204下通过压缩包的方式安装jdk1.8,rpm的直接运行就行了. 2.步骤 2.1 下载 地址:http://www.oracle.com/techne ...

  2. 解决ubuntu sudo not found command的问题

    将/etc/sudoers 中Defaults env_reset改成Defaults !env_reset取消掉对PATH变量的重置, 然后在/etc/bash.bashrc中最后添加alias s ...

  3. hdu 1542 Atlantis(线段树,扫描线)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  4. [转]响应式网页设计:rem、em设置网页字体大小自适应

    本文转自:http://www.cnblogs.com/aimyfly/archive/2013/07/19/3200742.html 「rem」是指根元素(root element,html)的字体 ...

  5. DAC使用基本准则

    DAC Nyquist Zones, Zero Order Hold, and Images why do the Fout images exist in every Nyquist zone? W ...

  6. 【Android UI设计与开发】7.底部菜单栏(四)PopupWindow 实现显示仿腾讯新闻底部弹出菜单

    前一篇文章中有用到 PopupWindow 来实现弹窗的功能.简单介绍以下吧. 官方文档是这样解释的:这就是一个弹出窗口,可以用来显示一个任意视图.出现的弹出窗口是一个浮动容器的当前活动. 1.首先来 ...

  7. 怎样用ZBrush中复数对象进行工作

    在ZBrush®中有两种方法可以使用复数对象即“多边形组”和“次工具”. 若有疑问可直接访问:http://www.zbrushcn.com/jichu/fushu-duixiang.html 什么是 ...

  8. ckplayer播放器去掉右边的开关灯分享插件

    在上一篇文章中介绍了如何使用ckplayer播放器,但是有的人不需要CK播放器右边的开关灯分享插件,那么就需要把该插件给去掉,方法也很简单. 第一步:先打开ckplayer.js里找到下面三行删除掉 ...

  9. java 21 - 11 IO流的标准输入流和标准输出流

    标准输入输出流 System类中的两个成员变量: public static final InputStream in "标准"输入流. public static final P ...

  10. 转:CentOS设置时区

    from: http://os.51cto.com/art/201004/192805.htm 建议直接使用: 1. session 临时修改查看: tzselect. 然后数字键入,回车 2. 永久 ...