using System;
using System.Collections.Generic;
using System.IO; namespace CovarientAndContraVarient
{
class Program
{
static object GetObject() { return null; }
static void SetObject(object obj) { } static string GetString() { return ""; }
static void SetString(string str) { } static void Main(string[] args)
{
Func<object> getString = GetString; Action<string> setString = SetObject; Func<string> getString1 = GetString; //1. Delegate variable implicitly cast is not valid until .net 4.0
Func<object> setString2 = getString1; //Assignment compatibility,
IEnumerable<String> test = new List<string>(); //covariance OUT == > Covariance
IEnumerable<object> test1 = new List<string>(); //Assignment compatibility
Action<Object> objAction = StaticMethod; //ContraConvariance , IN === > ContraConvariance
Action<String> stringAction = StaticMethod; //2. Array Covariance, support in C# 1.0
object[] objArray = new String[] { "a", "b", "c" }; //Covariance in array is not safe, below code will throw exception
objArray[] = ; //3. Co/contra- Variance don't support value type, below code is invalid
//IEnumerable<object> objects = new List<int>(); //you can use an interface instance that has methods with more
//derived return types than originally specified (covariance--OUT)
//or that has methods with less derived parameter types (contravariance--IN). //Contravariance
IMyTest<FileStream> myTestInstance = new MyTestClass1<Stream>(); IMyTest<Stream> myTest = new MyTestClass1<Stream>(); //covariance
IMyTest1<object> myTest1Instance = new MyTestClass2<string>(); IMyTest<FileStream> myTestInstance1 = myTest; //Below Code, you will think it is a little strange, but absolutely it works well!!!!!!!!!
//4. You can mark a generic type parameter as covariant if it is used only as a method return
//type and is not used as a type of formal method parameters.
//5. And vice versa, you can mark a type as contravariant if it is used only as a type of
//formal method parameters and not used as a method return type.
IMyFirstTestClass<object, string> testClass = null;
IMyFirstTestClass<string, object> testClass1 = testClass;
} public static void StaticMethod(object o)
{
}
} public interface IMyFirstTestClass<in T1, out T2>
{
T2 DoSomething(T1 para);
} //6. Variant type only can declared in interfaces and delegates only!!!!!!!
//public class MyTestClass<in T>
//{ //} //Contravariance
public interface IMyTest<in T>
{
void PrintTest(T param);
} //7. Below code, T is invariance, if you want to it be Contravariance, you must declare it explicitly.
//Same as covariance
public interface IMyTestExtend<T> : IMyTest<T>
{
} public class MyTestClass1<T> : IMyTest<T>
{
public void PrintTest(T para)
{
Console.WriteLine("This is " + typeof(T) + " PrintTest Method!");
}
} //Covariance
public interface IMyTest1<out T>
{
T PrintTest();
} public class MyTestClass2<T> : IMyTest1<T>
{
public T PrintTest()
{
Console.WriteLine("This is " + typeof(T) + " PrintTest Method!");
return default(T);
}
} public delegate void MyHander<in T>(T para); //Below method declaration is invalid, because 'in' is contravariance, it only can be in paramter type
//public delegate T MyHander1<in T>(T para); public delegate T MyHandler2<out T>(object para); //Below method declaration is invalid, because 'out' is covariance, it only can be in returned type
//public delegate void MyHandler2<out T>(T para); }

FYI: http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx

Covarience And ContraVariance的更多相关文章

  1. 不变性、协变性和逆变性(Invariance, Covariance & Contravariance)

    源码下载 一.里氏替换原则(Liskov Substitution Principle LSP) 我们要讲的不是协变性和逆变性(Covariance & Contravariance)吗?是的 ...

  2. Covariance and Contravariance in C#, Part One

    http://blogs.msdn.com/b/ericlippert/archive/2007/10/16/covariance-and-contravariance-in-c-part-one.a ...

  3. 协变(covariance),逆变(contravariance)与不变(invariance)

    协变,逆变与不变 能在使用父类型的场景中改用子类型的被称为协变. 能在使用子类型的场景中改用父类型的被称为逆变. 不能做到以上两点的被称为不变. 以上的场景通常包括数组,继承和泛型. 协变逆变与泛型( ...

  4. Covariance and Contravariance (C#)

    Covariance and Contravariance (C#) https://docs.microsoft.com/en-us/dotnet/articles/csharp/programmi ...

  5. C# 逆变(Contravariance)/协变(Covariance) - 个人的理解

    逆变(Contravariance)/协变(Covariance) 1. 基本概念 官方: 协变和逆变都是术语,前者指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类型,后者指能够使用比原始 ...

  6. Covariance and Contravariance in C#, Part Two: Array Covariance

    http://blogs.msdn.com/b/ericlippert/archive/2007/10/17/covariance-and-contravariance-in-c-part-two-a ...

  7. C#中的协变(Covariance)和逆变(Contravariance)

    摘要 ● 协变和逆变的定义是什么?给我们带来了什么便利?如何应用? ● 对于可变的泛型接口,为什么要区分成协变的和逆变的两种?只要一种不是更方便吗? ● 为什么还有不可变的泛型接口,为什么有的泛型接口 ...

  8. 《徐徐道来话Java》(2):泛型和数组,以及Java是如何实现泛型的

    数组和泛型容器有什么区别 要区分数组和泛型容器的功能,这里先要理解三个概念:协变性(covariance).逆变性(contravariance)和无关性(invariant). 若类A是类B的子类, ...

  9. .NET中的逆变协变

    MSDN上的说法: 协变和逆变都是术语,前者指能够使用比原始指定的派生类型的派生程度更小(不太具体的)的类型,后者指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类型----------(注 ...

随机推荐

  1. Spring学习之声明式事物管理

    public List<Student> selectStudent() { Student s = new Student(); s.setName("zhengbin&quo ...

  2. Android开发中如何调用摄像头的功能

    我们要调用摄像头的拍照功能,显然 第一步必须加入调用摄像头硬件的权限,拍完照后我们要将图片保存在SD卡中,必须加入SD卡读写权限,所以第一步,我们应该在Android清单文件中加入以下代码     & ...

  3. delphi 对话框初始地址InitialDir

    我的电脑:SaveDialog1.InitialDir := '::{20D04FE0-3AEA-1069-A2D8-08002B30309D}';// My Computer {20D04FE0-3 ...

  4. Android 生成含签名文件的apk安装包

    做android开发时,必然需要打包生成apk文件,这样才能部署.作为一个完善的apk,必然少不了签名文件,否则下次系统无法进行更新. 一.签名文件的制作及打包生成APK文件 签名文件比较流行的制作方 ...

  5. Informatica 9.1常用查询

    select a.mapping_name, a.mapping_id, a.subject_id, a.is_valid, b.pv_precision, c.pv_value, b.pv_defa ...

  6. Domain Name System (DNS)

    1.DNS和WINS的作用 DNS:(Domain Name Server,域名服务)用于实现域名和IP地址的相互转换. WINS:(Windows Internet Name Service) 用来 ...

  7. Flash Player”又来了“!

    2012年,Adobe宣布缩小对Linux平台的支持,自Flash Player 11.2版本之后,只为Linux平台上的Flash Player提供安全更新和bug修复,而不再提供版本更新. 四年之 ...

  8. loadrunner 发送gzip压缩json格式(转)

    转:http://blog.csdn.net/gzh0222/article/details/7711281 使用java vuser实现,发送gzip压缩json格式. /* * LoadRunne ...

  9. Qt加载网页(加载浏览器插件)和制作托盘后台运行(南信大财务报账看号)

    程序模块要添加QNetWork和QWebKit模块: nuistfinancevideo.h文件: #ifndef NUISTFINANCEVIDEO_H #define NUISTFINANCEVI ...

  10. VC++6.0连接Access数据库

    建立一个连接数据库的类: 1.头文件:ADOConn.h #import "C:\Program Files\Common Files\System\ado\msado15.dll" ...