C# 泛型的协变
class Program
{
static void Main(string[] args)
{
Person person = new Person();
Person chinese2 = new Chinese();//chinese继承自person,所以允许转换 List<Person> people = new List<Person>();
//以下代码不允许。
//一群中国人难道不是一群人??
//1、list<people>与list<chinese>没有继承关系。
//2、若成立,就可以向这个列表中写入people类型数据,也可以写入chinese类型数据,这是类型不安全的
List<Person> chineses = new List<Chinese>(); //另外一个更容易理解的例子
//所有类都是Object的子类,若这个转换成立,那么list里可以有各种各样的数据。
List<object> list = (List<object>)people; //协变
IMyList<Person> myPeople = new MyList<Chinese>();
myPeople.Item = new Person();//协变的属性是只读的,所以报错 //协变的前提:
//1、只有泛型接口和泛型委托才可以协变,详见MyList2类
//2、协变的类型实参只能是引用类型,不能是值类型
IMyList<object> myList1 = new MyList<int>(); }
} class Person
{
public int ID { get; set; }
public string Name { get; set; }
} class Chinese: Person
{
public string Gender { get; set; }
}
/// <summary>
/// c#4.0起,使用out 类型参数修饰符允许协变。
/// 协变类型参数只能是只读;
/// out修饰符会让编译器验证T是否真的只用作“输出”,且永远不用于形参或属性的赋值方法
/// </summary>
/// <typeparam name="T"></typeparam>
interface IMyList< out T>
{ public T Item { get;}
/// <summary>
/// out 修饰的类型参数必须是只读,所以代码报错
/// </summary>
public T Item2 { get; set; }
/// <summary>
/// out 修饰的类型参数不能做为形参,所以代码报错
/// </summary>
/// <param name="t"></param>
public void SetValue(T t); }
/// <summary>
/// 实现接口类
/// </summary>
/// <typeparam name="T"></typeparam>
class MyList<T> : IMyList<T>
{
public T Item => default(T); public T Item2 { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public void SetValue(T t)
{ }
}
/// <summary>
/// 只有泛型接口和泛型委托才可以协变。泛型类型与结构永远不可协变
/// </summary>
/// <typeparam name="T"></typeparam>
class MyList2<out T>
{ }
C# 泛型的协变的更多相关文章
- .NET 4.0中的泛型的协变和逆变
转自:http://www.cnblogs.com/jingzhongliumei/archive/2012/07/02/2573149.html 先做点准备工作,定义两个类:Animal类和其子类D ...
- Java用通配符 获得泛型的协变和逆变
Java对应泛型的协变和逆变
- 转载.NET 4.0中的泛型的协变和逆变
先做点准备工作,定义两个类:Animal类和其子类Dog类,一个泛型接口IMyInterface<T>, 他们的定义如下: public class Animal { } public ...
- java 泛型没有协变类型, 所以要重用extends, 但使用List<? extends Fruit> 可以是ArrayList<Fruit>()、ArrayList<Apple>()、ArrayList<Orange>(), 因此不能add元素进去
class Fruit{} class Apple extends Fruit{} class SubApple extends Apple{} class Orange extends Fruit{ ...
- Java泛型的协变
在上篇<Java泛型的基本使用>这篇文章中遗留以下问题,即将子类型也能添加到父类型的泛型中,要实现这种功能必须借助于协变. 实验准备 现在在上篇文章展示的Decorator类型的基础上,增 ...
- Kotlin泛型与协变及逆变原理剖析
在上一次https://www.cnblogs.com/webor2006/p/11234941.html中学习了数据类[data class]相关的知识,这次会学习关于泛型相关的东东,其中有关于泛型 ...
- Java泛型的协变与逆变
泛型擦除 Java的泛型本质上不是真正的泛型,而是利用了类型擦除(type erasure),比如下面的代码就会出现错误: 报的错误是:both methods have same erasure ...
- C#4.0泛型的协变,逆变深入剖析
C#4.0中有一个新特性:协变与逆变.可能很多人在开发过程中不常用到,但是深入的了解他们,肯定是有好处的. 协变和逆变体现在泛型的接口和委托上面,也就是对泛型参数的声明,可以声明为协变,或者逆变.什么 ...
- C# 泛型的协变和逆变
1. 可变性的类型:协变性和逆变性 可变性是以一种类型安全的方式,将一个对象当做另一个对象来使用.如果不能将一个类型替换为另一个类型,那么这个类型就称之为:不变量.协变和逆变是两个相互对立的概念: 如 ...
- C# 泛型的协变和逆变 (转载)
1. 可变性的类型:协变性和逆变性 可变性是以一种类型安全的方式,将一个对象当做另一个对象来使用.如果不能将一个类型替换为另一个类型,那么这个类型就称之为:不变量. 协变和逆变是两个相互对立的概念: ...
随机推荐
- Solon详解(九)- 渲染控制之定制统一的接口输出
Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...
- Centos-链接-ln
ln 用来在文件或者目录之间创建链接,分为软链接和硬链接,硬链接依据文件的inode来进行链接,linux系统中允许存在多个inode号,文件真正的删除,是指向这个文件block的inode为0则该数 ...
- Centos-创建目录-mkdir
mkdir 创建目录 相关选项 -m 对新建目录设置存取权限,数字表现形式 -p 递归创建目录
- 放弃"指针常量"这种不严谨的中文描述!深度理解数组名、指针常量
ques1: 数组名完全等价于指针常量吗? int array[10] = { 10,11,12,13,14,15 }; printf("sizeof(array)= %d \n" ...
- IOS 数据储存
IOS 数据存储 ios数据存储包括以下几种存储机制: 属性列表 对象归档 SQLite3 CoreData AppSettings 普通文件存储 1.属性列表 // // Persistence1 ...
- 093 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 03 static关键字(下)
093 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
- Fabric1.4.4 多机solo共识搭建
简单记录一下fabric版本1.4.4的搭建部署,运行环境为CentOs7.8,如有错误欢迎批评指正.然后就是本编文章不对环境搭建做说明,基础环境搭建看这里. 1.总体设计 本案例部署一个排序(ord ...
- springMvc配置拦截器无效
说明 springMvc配置国际化拦截器失败,点击页面按钮切换中英文无效,排查发现没有进入 LocaleChangeInterceptor 类中,判断拦截器没有起作用,那么是什么原因导致拦截器无效,通 ...
- 基于Python的接口自动化实战-基础篇之读写配置文件
引言 在编写接口自动化测试脚本时,有时我们需要在代码中定义变量并给变量固定的赋值.为了统一管理和操作这些固定的变量,咱们一般会将这些固定的变量以一定规则配置到指定的配置文件中,后续需要用到这些变量和变 ...
- linux(centos8):安装jmeter5.3
一,jmeter的用途: Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试, 它最初被设计用于Web应用测试,但后来扩展到其他测试领域. Apach ...