C#2.0新增功能06 协变和逆变
在 C# 中,协变和逆变能够实现数组类型、委托类型和泛型类型参数的隐式引用转换。 协变保留分配兼容性,逆变则与之相反。
以下代码演示分配兼容性、协变和逆变之间的差异。
// 分配兼容性.
string str = "test";
// 将派生类型更高的对象分配给派生类型更低的对象
object obj = str; IEnumerable<string> strings = new List<string>();
// 用派生类型参数实例化的对象被分配给用派生类型参数实例化的对象。// 分配兼容性保持不变。
IEnumerable<object> objects = strings; // 逆变.
// 假设以下方法在类中:static void SetObject(object o) { }
Action<object> actObject = SetObject;
// 使用派生程度较低的类型参数实例化的对象被分配给使用派生程度较高的类型参数实例化的对象。// 分配兼容性被反转.
Action<string> actString = actObject;
对方法组的协变和逆变支持允许将方法签名与委托类型相匹配。 这样,不仅可以将具有匹配签名的方法分配给委托,还可以分配与委托类型指定的派生类型相比,返回派生程度更大的类型的方法(协变)或接受具有派生程度更小的类型的参数的方法(逆变)。 有关详细信息,请参阅委托中的变体 (C#) 和使用委托中的变体 (C#)。
以下代码示例演示对方法组的协变和逆变支持。
static object GetObject() { return null; }
static void SetObject(object obj) { }
static string GetString() { return ""; }
static void SetString(string str) { }
static void Test()
{
// 协变. 委托将返回类型指定为对象,但可以指定返回字符串的方法。
Func<object> del = GetString;
// 逆变. 委托将参数类型指定为字符串,但可以指定接受对象的方法。
Action<string> del2 = SetObject;
}
在 .NET Framework 4 或较新的 C# 中,支持在泛型接口和委托中使用协变和逆变,并允许隐式转换泛型类型参数。 有关详细信息,请参阅泛型接口中的变体 (C#) 和委托中的变体 (C#)。《C#4.0新增功能03 泛型中的协变和逆变》
以下代码示例演示泛型接口的隐式引用转换。
IEnumerable<String> strings = new List<String>();
IEnumerable<Object> objects = strings;
如果泛型接口或委托的泛型参数被声明为协变或逆变,该泛型接口或委托则被称为“变体”。 凭借 C#,能够创建自己的变体接口和委托。 有关详细信息,请参阅创建变体泛型接口 (C#) 和委托中的变体 (C#)。
相关主题
| Title | 说明 |
|---|---|
| 泛型接口中的变体 (C#) | 讨论泛型接口中的协变和逆变,提供 .NET Framework 中的变体泛型接口列表。 |
| 创建变体泛型接口 (C#) | 演示如何创建自定义变体接口。 |
| 在泛型集合的接口中使用变体 (C#) | 演示 IEnumerable<T> 接口和 IComparable<T> 接口中对协变和逆变的支持如何帮助重复使用代码。 |
| 委托中的变体 (C#) | 讨论泛型委托和非泛型委托中的协变和逆变,并提供 .NET Framework 中的变体泛型委托列表。 |
| 使用委托中的变体 (C#) | 演示如何使用非泛型委托中的协变和逆变支持以将方法签名与委托类型相匹配。 |
| 对 Func 和 Action 泛型委托使用变体 (C#) | 演示 Func 委托和 Action 委托中对协变和逆变的支持如何帮助重复使用代码。 |
C#2.0新增功能06 协变和逆变的更多相关文章
- c#4.0新特性之协变与逆变
1.C#3.0以前的协变与逆变 如果你是第一次听说这个两个词,别担心,他们其实很常见.C#4.0中的协变与逆变[1](Covariance and contravariance)有了进一步的完善,主要 ...
- .NET 4.0中的泛型协变和逆变
随Visual Studio 2010 CTP亮相的C#4和VB10,虽然在支持语言新特性方面走了相当不一样的两条路:C#着重增加后期绑定和与动态语言相容的若干特性,VB10着重简化语言和提高抽象能力 ...
- C#3.0新增功能06 对象和集合初始值设定项
连载目录 [已更新最新开发文章,点击查看详细] 使用 C# 可以在单条语句中实例化对象或集合并执行成员分配. 对象初始值设定项 使用对象初始值设定项,你可以在创建对象时向对象的任何可访问字段或属 ...
- .NET 4.0中的泛型的协变和逆变
转自:http://www.cnblogs.com/jingzhongliumei/archive/2012/07/02/2573149.html 先做点准备工作,定义两个类:Animal类和其子类D ...
- 转载.NET 4.0中的泛型的协变和逆变
先做点准备工作,定义两个类:Animal类和其子类Dog类,一个泛型接口IMyInterface<T>, 他们的定义如下: public class Animal { } public ...
- Java协变、逆变、类型擦除
协变.逆变 定义 Java中String类型是继承自Object的,姑且记做String ≦ Object,表示String是Object的子类型,String的对象可以赋给Object的对象.而Ob ...
- C#4.0新增功能03 泛型中的协变和逆变
连载目录 [已更新最新开发文章,点击查看详细] 协变和逆变都是术语,前者指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类型,后者指能够使用比原始指定的派生类型的派生程度更小(不太具体 ...
- C#基础拾遗系列之二:使用ILSpy探索C#7.0新增功能点
C#基础拾遗系列之二:使用ILSpy探索C#7.0新增功能点 第一部分: C#是一种通用的,类型安全的,面向对象的编程语言.有如下特点: (1)面向对象:c# 是面向对象的范例的一个丰富实现, 它 ...
- C#4.0泛型的协变,逆变深入剖析
C#4.0中有一个新特性:协变与逆变.可能很多人在开发过程中不常用到,但是深入的了解他们,肯定是有好处的. 协变和逆变体现在泛型的接口和委托上面,也就是对泛型参数的声明,可以声明为协变,或者逆变.什么 ...
随机推荐
- Nginx 部署 Ant Design pro
利用Ant Design pro开发的项目,如何用Nginx部署呢? 第一步:把项目打包,打包命令如下: npm run build 运行完毕会在项目目录下生成dist文件夹. 第二步:想要测试打包好 ...
- QObject提供了QMetaObject元类信息(相当于RTTI和反射),信号与连接,父子关系,调试信息,属性,事件,继承关系,窗口类型,线程属性,时间器,对象名称,国际化
元类信息(相当于RTTI和反射),信号与连接,父子关系,调试信息,属性,事件,继承关系,窗口类型,线程属性,时间器,对象名称,国际化其中元类又提供了:classInfo,className,构造函数, ...
- MISP版本嵌入式QT编译时出现mips-linux-gcc command not found
configure的时候都没什么问题我的configure是:./configure -prefix /opt/qt-jz -xplatform qws/linux-mips-g++ -embedde ...
- 深入浅出RPC——浅出篇(转载)
本文转载自这里是原文 近几年的项目中,服务化和微服务化渐渐成为中大型分布式系统架构的主流方式,而 RPC 在其中扮演着关键的作用. 在平时的日常开发中我们都在隐式或显式的使用 RPC,一些刚入行的程序 ...
- 利用Rsync同步工具上传、删除目标文件
Rsync是文件备份工具,当然也可以当做传输工具,管理远程服务器的文件 上传 rsync -avzP --progress --port 9106 /path/.../指定文件 root@192.16 ...
- abp(net core)+easyui+efcore仓储系统——展现层实现增删改查之控制器(六)
abp(net core)+easyui+efcore仓储系统目录 abp(net core)+easyui+efcore仓储系统——ABP总体介绍(一) abp(net core)+easyui+e ...
- 使用Hibernate连接Oracle 无法识别生成的SQL问题
问题: 在JAVA工程中,数据库使用的是OracleXE(Oracle10g Express Edition). 使用hibernate.reveng.xml创建了实体类及其DAO类,如: tt.my ...
- fork和僵尸进程
1. 关于fork fork()函数: 用于创建一个进程,所创建的进程复制父进程的代码段/数据段/BSS段/堆/栈等所有用户空间信息:在内核中操作系统重新为其申请了一个PCB,并使用父进程的PCB进行 ...
- Error: Cannot find module '@babel/runtime/core-js/object/keys'(npm start报错)
1.问题描述: 在npm start启动react项目的时候,会出现Cannot find module '@babel/runtime/core-js/object/keys'的报错: 打开:项目根 ...
- 【Netty整理03-NIO】Java 实现 NIO demo
jdk提供的NIO使用: 概览:https://blog.csdn.net/the_fool_/article/details/83000648 博主抄写了网上的demo,略作修改与调整,原文链接: ...