07.C#泛型的限制和可空类型的简单说明(三章3.5-四章4.1)
自己在写文章的同时,也是在学习,对于书中的语句很多其实没有太好的理解,读一本书,要消化!!!三章都是讲泛型的,最后写一下泛型的限制,对于本章学习的完结,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)的更多相关文章
- C#可空类型(转载)
在程序开发中,有时候需要值类型也为可空类型,比如,在数据库中,我们可以把一个日期Datetime设置为null. 在C# 2.0中就出现了可空类型,允许值类型也可以为空(null),可空类型的实现基于 ...
- 泛型 System.Collections.Generic及泛型继承、运算符、结构、接口、方法、委托、事件、可空类型等
一.定义泛型类 void Main() { //实例化泛型类时,才指定具体的类型 MyGenericClass<); Console.WriteLine(MyGeneri.InnerT1Obje ...
- C#基础知识系列二(值类型和引用类型、可空类型、堆和栈、装箱和拆箱)
前言 之前对几个没什么理解,只是简单的用过可空类型,也是知道怎么用,至于为什么,还真不太清楚,通过整理本文章学到了很多知识,也许对于以后的各种代码优化都有好处. 本文的重点就是:值类型直接存储其值,引 ...
- C#2.0之可空类型
可空类型Nullable<T> 在C#2.0之前 ,值类型一直不可以为null,但是实际开发中常常会有这样的需求,比如结束时间. 为什么不可以为null 对于引用类型来说,null代表着空 ...
- 工作总结 无法确定条件表达式的类型,因为“<null>”和“System.DateTime”之间没有隐式转换 解决办法 object——Nullable<T> (可空类型)
可空值类型 备注 一种类型认为是可以为 null,如果它可以分配一个值,也可以分配null,这意味着类型具有无论如何没有值. 默认情况下,所有都引用类型,如String,是否可以为 null, ...
- [C#基础知识系列]专题十:全面解析可空类型[转]
原文链接 主要内容: 1:空合并操作符(?? 操作符) ??操作符也就是"空合并操作符",它代表的意思是两个操作数,如果左边的数不为null时,就返回左边的数,如果左边的数为nul ...
- 细说可空类型 nullable PropertyType
可空类型是System.Nullable结构体的实列.一个可空类型代表了相应值类型的正确范围附加null值.这么说来,其实也不是很明子,命题嘛,一般不求易懂,但求准确. 那我就来说说这可空类型吧,上次 ...
- C#可空类型知多少
在项目中我们经常会遇到可为空类型,那么到底什么是可为空类型呢?下面我们将从4个方面为大家剖析. 1.可空类型基础知识 顾名思义,可空类型指的就是某个对象类型可以为空,同时也是System.Nullab ...
- 四、可空类型Nullable<T>到底是什么鬼
值类型为什么不可以为空 首先我们都知道引用类型默认值都是null,而值类型的默认值都有非null. 为什么引用类型可以为空?因为引用类型变量都是保存一个对象的地址引用(就像一个url对应一个页面),而 ...
随机推荐
- Java读取、创建xml(通过dom方式)
创建一个接口 XmlInterface.java public interface XmlInterface { /** * 建立XML文档 * @ ...
- 关于 Python 你需要知道的几个概念
Python 一种支持面向对象和函数式(面向过程)的高级编程语言 CPython 由 C 语言编译,一种默认的,通常我们所提及的基于 C 的 Python 的一种实现 Cython 一种 Python ...
- [转].NET下读取PDF文本
本文转自:http://blog.csdn.net/wangqiuyun/article/details/8548779 在.NET下读取PDF文本用到的类库主要有两个:PDFBox和iTextSha ...
- poj-1083-Moving Tables(hdu-1050)
Moving Tables Time Limit: 1000MS Memory Limit: 10000K Total Submissions: Accepted: Description The f ...
- 对于大学4年的反思(续),记我的ThoughtWorks面试
之前我写了一篇对于大学四年的反思,时隔一个月,为什么我这么快就要来写这篇续章呢?主要有两个原因,第一是感谢静子姐姐,记得知乎上有个回答里面说过人生需要有贵人的帮助,遇到贵人是一件很幸运的事情.我想,静 ...
- 【ASP.NET 基础】ASP.NET内置对象
准确地说,asp.net 并没有内置对象这一说,jsp 里确实把 request.response 这些当作 jsp 的内置对象,这里只不过是借用了一下 jsp 的说法而已.在 Web 中处于中心的是 ...
- UESTC 900 方老师炸弹 --Tarjan求割点及删点后连通分量数
Tarjan算法. 1.若u为根,且度大于1,则为割点 2.若u不为根,如果low[v]>=dfn[u],则u为割点(出现重边时可能导致等号,要判重边) 3.若low[v]>dfn[u], ...
- LoadRunner参数化MySQL
准备:安装[msql-ODBC驱动] 一.配置数据源 1.Win7,打开控制面板-系统和安全-管理工具,点击“数据源(ODBC)”. 打开数据源(ODBC),在用户DSN选项卡中点击“添加”按钮,弹出 ...
- 安装grunt
1,npm install -g grunt-cli 2,npm install grunt --save 作为项目的依赖安装 这两步必不可少
- poj2407
欧拉函数裸题. 欧拉函数:在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目. 欧拉函数的定义: E(N)= ( 区间[1,N-1] 中与 N 互质的整数个数). 对于 积性函数 F ...