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. 可变性的类型:协变性和逆变性 可变性是以一种类型安全的方式,将一个对象当做另一个对象来使用.如果不能将一个类型替换为另一个类型,那么这个类型就称之为:不变量. 协变和逆变是两个相互对立的概念: ...
随机推荐
- Prime Path(POJ - 3126)【BFS+筛素数】
Prime Path(POJ - 3126) 题目链接 算法 BFS+筛素数打表 1.题目主要就是给定你两个四位数的质数a,b,让你计算从a变到b共最小需要多少步.要求每次只能变1位,并且变1位后仍然 ...
- [iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之一:OBJ格式分析
[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之一:OBJ文件格式分析作者:yuezang - iTyran 在iOS的3D开发中常常需要导入通过3DS MAX之类 ...
- 最全总结 | 聊聊 Python 数据处理全家桶(配置篇)
1.前言 在实际项目中,经常会接触到各种各样的配置文件,它可以增强项目的可维护性 常用配件文件的处理方式,包含:JSON.ini / config.YAML.XML 等 本篇文章,我们将聊聊 Pyth ...
- 实验 6:OpenDaylight 实验——OpenDaylight 及 Postman 实现流表下发
一.实验目的 熟悉 Postman 的使用;熟悉如何使用 OpenDaylight 通过 Postman 下发流表. 二.实验任务 流表有软超时和硬超时的概念,分别对应流表中的 idle_timeou ...
- Arduino 多线程简单代码
转载: 1. https://www.csdn.net/gather_27/MtTaggzsMDExMS1ibG9n.html 2. https://v.youku.com/v_show/id ...
- LPCTSTR类型和字符串
转载: 1.https://blog.csdn.net/Joker_mw/article/details/79127790 2.https://blog.csdn.net/shelleyhuhu/ar ...
- Oracle和MySql之间SQL区别(等效转换以及需要注意的问题)
本篇博文是Oracle和MySQL之间的等效SQL转换和不同,目前市面上没有转换两种SQL的工具,小编觉得以后也不一定会有,于是在业余时间整理了一下,如果有什么错误之处请留言告知,小编也是刚入门的小白 ...
- 盐城5138.6118(薇)xiaojie:盐城哪里有xiaomei
盐城哪里有小姐服务大保健[微信:5138.6118倩儿小妹[盐城叫小姐服务√o服务微信:5138.6118倩儿小妹[盐城叫小姐服务][十微信:5138.6118倩儿小妹][盐城叫小姐包夜服务][十微信 ...
- Martyr2项目实现——Number部分的问题求解 (1) Find Pi to Nth Digit
Martyr2项目实现--Number部分的问题求解 (1) Find Pi to Nth Digit Find Pi to Nth Digit 问题描述: Find PI to the Nth Di ...
- selenium--数据填充
from time import sleep from selenium import webdriver br = webdriver.Chrome() url = "https://ww ...