.NET4.0,C#泛型接口的协变与抗变
来源:互联网 发布:vs2005操作mysql 编辑:程序博客网 时间:2024/06/05 09:36
The covariance and contra-variance of C#
using System;
using System.Collections;
using System.Collections.Generic;
namespace C_exercise
{
class Mankind
{
}
class Chinese: Mankind
{
}
class MainClass
{
publicstaticvoid Display(Mankind Someone)
{
}
publicstatic Chinese GetChinese()
{
Chinese Lee =new Chinese ();
return Lee;
}
publicstatic Mankind GetMankind()
{
Mankind Jim =new Mankind ();
return Jim;
}
publicstaticvoid Main(string[] args)
{
//例一,参数类型的协变
var Liu =new Chinese ();
Display (Liu); //正确,Liu不只是中国人,同时也是人类。方法的参数类型的派生类型都可变为此方法的
//参数类型,但它的基类型无法变为它的参数类型。
//例二,方法的返回类型的抗变
Mankind TheStranger = GetChinese (); //正确,中国人一定是人类。
Chinese AnotherStranger = GetMankind ();//错误,返回的人是不确定国籍的,不一定是中国人。方法的返回类型的所有基类都可
//以变为此方法的返回类型,但它的派生类型无法变为它的返回类型。
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
.NET 4.0 泛型接口的协变
using System;
using System.Collections;
using System.Collections.Generic;
/// The covariance and contravariance of C#
namespace C_exercise
{
public interface IBorn<out T> //协变,泛型类型用out关键字标注,返回类型必须是T
{
T Born{get;}
}
class Mankind
{
}
class Chinese: Mankind
{
}
class ChineseBorn:IBorn<Chinese>
{
private Chinese Baby=new Chinese();
public Chinese Born
{
get
{
return Baby;
}
}
}
class MankindBorn:IBorn<Mankind>
{
private Mankind Baby=new Mankind();
public Mankind Born
{
get
{
return Baby;
}
}
}
class MainClass
{
//IBorn<Chinese> Zhang=new ChineseBorn(); //正确.
//IBorn<Mankind> Zhang=new ChineseBorn(); //正确,Zhang具有人类新生儿接口,可成为中国新生儿
//IBorn<Mankind> Zhang=new MankindBorn(); //正确
//IBorn<Chinese> Zhang=new MankindBorn(); //错误,Zhang只有中国新生儿接口,无法被赋予人类新生儿的所有内容。
//泛型接口的协变:所有泛型接口类型的派生类型对象都可以变为此泛型接口类型的对象,
publicstaticvoid Main(string[] args) //但它的基类型对象无法变为此泛型接口类型的对象。
{
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
.NET 4.0 泛型接口的抗变
using System;
using System.Collections;
using System.Collections.Generic;
/// The covariance and contravariance of C#
namespace Cexercise
{
publicinterface ICheck<in T> //抗变,in关键字标注,接口内方法输入类型必须为T
{
void State(T Someone);
}
class Mankind
{
}
class Chinese: Mankind
{
}
class MankindCheck:ICheck<Mankind>
{
publicvoid State(Mankind Someone)
{
Console.WriteLine ("Nation,Sex,Age");
}
}
class ChineseCheck:ICheck<Chinese>
{
publicvoid State(Chinese Someone)
{
Console.WriteLine ("Sex,Age");
}
}
class MainClass
{
publicstaticvoid Main(string[] args)
{
//ICheck<Mankind> HumanState = new MankindCheck (); //
//ICheck<Chinese> ChineseState = HumanCheck;//正确,人类检测实现了人类检测接口可以满足一切中国人检测的内容
ICheck<Chinese> ChineseState =new ChineseCheck ();//
ICheck<Mankind> MankindState = ChineseCheck;//错误,中国人检测接口无法满足人类检测接口的所有内容。
//泛型接口的抗变:所有泛型接口类型的基类的对象都可以变成此泛型
//接口的对象,但它的派生类型的对象无法变为此泛型接口类型的对象
}
}
}
- .NET4.0,C#泛型接口的协变与抗变
- 理解 C# 泛型接口中的协变与逆变(抗变)
- 关于C#泛型接口协变和抗变的一些理解
- C#泛型的协变和抗变
- C#中的协变与抗变
- C#中的协变与抗变(逆变)
- C#的协变和抗变
- C# 泛型的协变和逆变
- C# 泛型的协变和逆变
- C# 泛型的协变和逆变
- C# 泛型的协变和逆变
- C# -- 泛型(3)泛型的协变与逆变
- c#抗变 协变
- c# 抗变 协变
- 型变的理解,逆变与协变
- 2016-4-6--C#泛型变体(协变与抗变)
- asp.net 泛型的 协变与逆变
- c#协变与逆变
- Markdown 文字编辑器介绍
- ,,,,,ddfd
- Hibernate5 demo
- Hibernate5 demo
- Win7安装python第三方模块objgraph报错<UnicodeEncodeError: 'ascii' codec can't encode character u'\u258f'>
- .NET4.0,C#泛型接口的协变与抗变
- Vim 自动补全插件 YouCompleteMe 安装与配置
- 基于python3,抓取韩寒博客文章
- Kd-Tree算法原理和开源实现代码 本文为转载
- 用imagebox控件实现多种视频播放功能,并且帧图片可供后续处理
- libcocos2dx.a 出错解决。
- HDU5495求俩个1~n的数列按照相同的规则重排后的LCS
- HDU 5492 Find a path(DP)
- 6.Python深入_内存管理