当前位置: 首页 > news >正文

桂林网站建设服务电话在线平面设计师招募

桂林网站建设服务电话,在线平面设计师招募,网站做301根目录在哪,九一人才网赣州招聘官网1. 可变性的类型#xff1a;协变性和逆变性 可变性是以一种类型安全的方式#xff0c;将一个对象当做另一个对象来使用。如果不能将一个类型替换为另一个类型#xff0c;那么这个类型就称之为#xff1a;不变量。协变和逆变是两个相互对立的概念#xff1a; 如果某个返回的…1. 可变性的类型协变性和逆变性 可变性是以一种类型安全的方式将一个对象当做另一个对象来使用。如果不能将一个类型替换为另一个类型那么这个类型就称之为不变量。协变和逆变是两个相互对立的概念 如果某个返回的类型可以由其派生类型替换那么这个类型就是支持协变的如果某个参数类型可以由其基类替换那么这个类型就是支持逆变的。2. C# 4.0对泛型可变性的支持 在C# 4.0之前所有的泛型类型都是不变量——即不支持将一个泛型类型替换为另一个泛型类型即使它们之间拥有继承关系简而言之在C# 4.0之前的泛型都是不支持协变和逆变的。 C# 4.0通过两个关键字out和in来分别支持以协变和逆变的方式使用泛型。 我们来看一段利用了协变类型参数的代码 public class BaseClass {//... }public class DerivedClass : BaseClass {//... } 下面我们利用协变类型参数可以执行类似于普通的多态性的分配 IEnumerableDerivedClass d new ListDerivedClass(); IEnumerableBaseClass b d; 在上面的实例中在C# 4.0之前是不能正常编译的除了对赋值给基类集合时将子类集合做一个强制转换但是在运行时仍然会抛出一个类型转换的异常。 下面我们再看一个关于逆变的实例代码 ActionBaseClass b (target) { Console.WriteLine(target.GetType().Name); }; ActionDerivedClass d b; d(new DerivedClass()); 在上面的示例中我们 ActionBaseClass 类型的委托分配给类型 ActionDerivedClass 的变量根据逆变的定义我们可以知道 ActionT 类型是支持逆变的。 为什么IEnumerableT 和 ActionT 可以分别支持类型的协变和逆变呢我们查看这两个类型在 .NET 中的定义 //IEnumerableT 接口的定义(支持协变) public interface IEnumerableout T : IEnumerable//ActionT 委托的定义(支持逆变) public delegate void Actionin T(T obj); 为了保证类型的安全C#编译器对使用了 out 和 in 关键字的泛型参数添加了一些限制 支持协变(out)的类型参数只能用在输出位置函数返回值、属性的get访问器以及委托参数的某些位置支持逆变(in)的类型参数只能用在输入位置方法参数或委托参数的某些位置中出现。3. C#中泛型可变性的限制 1. 不支持类的类型参数的可变性 只有接口和委托可以拥有可变的类型参数。in 和 out 修饰符只能用来修饰泛型接口和泛型委托。 2. 可变性只支持引用转换 可变性只能用于引用类型禁止任何值类型和用户定义的转换如下面的转换是无效的 将 IEnumerableint 转换为 IEnumerableobject ——装箱转换将 IEnumerableshort 转换为 IEnumerableint ——值类型转换将 IEnumerablestring 转换为 IEnumerableXName ——用户定义的转换3. 类型参数使用了 out 或者 ref 将禁止可变性 对于泛型类型参数来说如果要将该类型的实参传给使用 out 或者 ref 关键字的方法便不允许可变性如 delegate void someDelegatein T(ref T t) 这段代码编译器会报错。 4. 可变性必须显式指定 从实现上来说编译器完全可以自己判断哪些泛型参数能够逆变和协变但实际却没有这么做这是因为C#的开发团队认为 必须由开发者明确的指定可变性因为这会促使开发者考虑他们的行为将会带来什么后果从而思考他们的设计是否合理。 5. 注意破坏性修改 在修改已有代码接口的可变性时会有破坏当前代码的风险。例如如果你依赖于不允许可变性的is或as操作符的结果运行在.NET 4时代码的行为将有所不同。同样在某些情况下因为有了更多可用的选项重载决策也会选择不同的方法。所以在对已有代码引入可变性时要做好足够的单元测试以及防御措施。 6. 多播委托与可变性不能混用 下面的代码能够通过编译但是在运行时会抛出 ArgumentException 异常 Funcstring stringFunc () ; Funcobject objectFunc () new object(); Funcobject combined objectFunc stringFunc; 这是因为负责链接多个委托的 Delegate.Combine方法要求参数必须为相同的类型。上面的示例我们可以修改成如下正确的代码 Funcstring stringFunc () ; Funcobject defensiveCopy new Funcobject(stringFunc); Funcobject objectFunc () new object(); Funcobject combined objectFunc defensiveCopy; 参考扩展阅读 协变和逆变泛型中的协变和逆变委托中的协变和逆变《深入理解C#》13.3 接口和委托的泛型可变性《Effective C#》条目29支持泛型协变和逆变《CLR via C#》12.5 委托和接口的逆变和协变泛型类型实参 转载于:https://www.cnblogs.com/IPrograming/p/4471130.html
http://www.zqtcl.cn/news/873281/

相关文章:

  • 做网站是做完给钱还是新房装修图片
  • 阿里云建站视频wordpress显示摘要插件
  • 济宁网站建设 企业谷网站开发有什么用
  • 网站建设一般多少钱官网代做网站公司哪家好
  • 页面简洁的网站深圳广告宣传片拍摄
  • 做外卖网站青岛助创网络科技有限公司
  • 怎么选择优秀的网站建设公司建设银行宁波分行 招聘网站
  • 工艺品网站模板下载-古色古香建站软件排名
  • 微视频网站源码网站建设目标个人博客dw
  • 山西省建设厅入晋备案网站洛阳网站在哪备案
  • 可以做物理试验的网站有哪些仿微博网站模板
  • 网站横幅怎做网站到期不想续费
  • 黑龙江网站备案管理局济南网站建设策划
  • 网站怎么静态化网页设计与制作图片显示不出来
  • 市场营销推广策划方案网站如何做标题优化
  • 怎么让客户做网站手机网站如何优化
  • 柳州市住房和城乡建设局网站首页赣州章贡区人口
  • 有偷菜餐厅城市建设的网站好的手机网站
  • 做进行网站推广赚钱互联网企业信息服务平台
  • 微信公众号做视频网站吗百度账号登录入口网页版
  • 北京建设银行纪念钞预定官方网站撤销网站备案申请书
  • 网站平台策划书安丘市建设局网站
  • 图片类网站建设seol英文啥意思
  • 网站编辑工作好做吗WordPress的图片存在哪
  • 你的网站尚未进行备案为什么网站百度搜不到了
  • 沙洋网站开发网站建设方案免费
  • iis建设网站教程单页面推广网站
  • 东莞网站建设效果郑州企业自助建站系统
  • php做的购物网站系统下载宜州做网站需要多少钱
  • 昆明网上商城网站建设怎么做网站教程视频