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# 泛型的协变的更多相关文章

  1. .NET 4.0中的泛型的协变和逆变

    转自:http://www.cnblogs.com/jingzhongliumei/archive/2012/07/02/2573149.html 先做点准备工作,定义两个类:Animal类和其子类D ...

  2. Java用通配符 获得泛型的协变和逆变

    Java对应泛型的协变和逆变

  3. 转载.NET 4.0中的泛型的协变和逆变

    先做点准备工作,定义两个类:Animal类和其子类Dog类,一个泛型接口IMyInterface<T>, 他们的定义如下:   public class Animal { } public ...

  4. 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{ ...

  5. Java泛型的协变

    在上篇<Java泛型的基本使用>这篇文章中遗留以下问题,即将子类型也能添加到父类型的泛型中,要实现这种功能必须借助于协变. 实验准备 现在在上篇文章展示的Decorator类型的基础上,增 ...

  6. Kotlin泛型与协变及逆变原理剖析

    在上一次https://www.cnblogs.com/webor2006/p/11234941.html中学习了数据类[data class]相关的知识,这次会学习关于泛型相关的东东,其中有关于泛型 ...

  7. Java泛型的协变与逆变

    泛型擦除 Java的泛型本质上不是真正的泛型,而是利用了类型擦除(type erasure),比如下面的代码就会出现错误: 报的错误是:both methods  have same erasure ...

  8. C#4.0泛型的协变,逆变深入剖析

    C#4.0中有一个新特性:协变与逆变.可能很多人在开发过程中不常用到,但是深入的了解他们,肯定是有好处的. 协变和逆变体现在泛型的接口和委托上面,也就是对泛型参数的声明,可以声明为协变,或者逆变.什么 ...

  9. C# 泛型的协变和逆变

    1. 可变性的类型:协变性和逆变性 可变性是以一种类型安全的方式,将一个对象当做另一个对象来使用.如果不能将一个类型替换为另一个类型,那么这个类型就称之为:不变量.协变和逆变是两个相互对立的概念: 如 ...

  10. C# 泛型的协变和逆变 (转载)

    1. 可变性的类型:协变性和逆变性 可变性是以一种类型安全的方式,将一个对象当做另一个对象来使用.如果不能将一个类型替换为另一个类型,那么这个类型就称之为:不变量. 协变和逆变是两个相互对立的概念: ...

随机推荐

  1. NX二次开发-C#使用DllImport调用libufun.dll里的UF函数(反编译.net.dll)调用loop等UF函数

    在写这篇文章的时候,我正在头晕,因为下班坐车回家,有些晕车了.头疼的要死.也吃不下去饭. 版本:NX11+VS2013 最近这一年已经由C++过度到C#,改用C#做应用程序开发和NX二次开发. C#在 ...

  2. PHP代码审计02之filter_var()函数缺陷

    前言 根据红日安全写的文章,学习PHP代码审计审计的第二节内容,题目均来自PHP SECURITY CALENDAR 2017,讲完这个题目,会有一道CTF题目来进行巩固,外加一个实例来深入分析,想了 ...

  3. Python练习题 003:完全平方数

    [Python练习题 003]一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? --------------------------------------- ...

  4. 如何用5000行JS撸一个关系型数据库

    首先声明,我不是标题党,我真的是用5000行左右的JS实现了一个轻量级的关系型数据库JSDB,核心是一个SQL编译器,支持增删改查. 源代码放到github上了:https://github.com/ ...

  5. C/C++ typedef用法

    原文来源:https://blog.csdn.net/superhoy/article/details/53504472 第一.四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同 ...

  6. matlab中sum

    来源:https://ww2.mathworks.cn/help/matlab/ref/sum.html?searchHighlight=sum&s_tid=doc_srchtitle#btv ...

  7. Jmeter之『JSR223脚本』

    Json处理(通过JS) 对于Json字符串,需要使用单引号『''』(因为Json中已存在双引号) // String转为Object var jsonObj = JSON.parse('${data ...

  8. Consul 学习笔记-服务注册

    Consul简介: Consul是一种服务网格解决方案,提供具有服务发现,配置和分段功能的全功能控制平面.这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建完整的服务网格.Consul需要 ...

  9. 应用启动失败,报错:The server experienced an unexpected error when processing the request

    前言 在腾讯云TKE集群中部署服务的时候,预警服务,warn一直重启,经过查询日志发现了如下的错误 The server experienced an unexpected error when pr ...

  10. RHSA-2018:0151-重要: 内核 安全和BUG修复更新(需要重启、存在EXP、本地提权)

    [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...