c#协变-逆变复习

原创 2016年08月28日 20:23:42
c#中泛型同c++中的stl基本类似。
例子如下:
using System;
class Test
{
    public static void Main()
    {
        int a = 1, b = 2;
        string s1 = "ni", s2 = "hao";
        swap(ref a,ref b);    //调用泛型的方法
        swap(ref s1, ref s2);
        Console.WriteLine(a + " " + b);
        Console.WriteLine(s1 + s2);
    } 
    public static void swap<T>(ref T a, ref T b)  //定义一个泛型的方法
    {
        T temp;
        temp = a;
        a = b;
        b = temp;
    }
}

为了能使泛型接口引用子类对象时使用object类型来接受其它类型的对象,引入协变,例子如下
using System;
interface IWrapper<T>   //定义一个泛型接口
{
    void SetData(T data);
    
}

interface IRestore<out T>  //定义一个协变的泛型接口
{
    T GetData();
}


class Wrapper<T> : IWrapper<T>,IRestore<T>   //创建一个泛型类
{
    private T storedData;   //返回这个数据
    void IWrapper<T>.SetData(T data)
    {
        this.storedData = data;
    }
    T IRestore<T>.GetData()
    {
        return this.storedData;
    }
}

class Test
{
    public static void Main()
    {
        Wrapper<string> wrapper = new Wrapper<string>();
        IWrapper<string> Iwr = wrapper;
        Iwr.SetData("nihao");   //使用接口调用子类对象
        IRestore<object> irestore = wrapper;   //通过协变可以接受string类型的对象
        Console.WriteLine(irestore.GetData());  
    }
}

总结一句话就是:object类型的接口来引用其它类型的对象时使用协变
与之相反的是:其它类型的对象来引用object类型的对象时使用逆变
注意:两者都是建立在泛型接口的基础之上的。
以下是逆变的例子:
using System;
interface SetData<in T>  //使用逆变
{
    void setdata(T data);
}

interface GetData<out T>   //使用协变
{
    T getdata();
}

class mytest<T> : SetData<T>, GetData<T>//继承两个泛型接口
{
    private T data;
    public void setdata(T data)
    {
        this.data = data;   //赋值
    }
    public T getdata()
    {
        return this.data;   //取数据
    } 
}

class Test
{
    public static void Main()
    {
        mytest<object> my = new mytest<object>();
        SetData<string> set = my;
        set.setdata("nihao");

    }
}











理解C#中的协变和逆变

  • 2014年08月06日 15:33
  • 24KB
  • 下载

C# 入门(13) 泛型(generic)、协变(convariance)、逆变(contravariance)

C#的泛型 协变 逆变

浅谈 C# 协变与逆变中 “out” 与 “in” 关键字的必要性

近来经常涉及泛型委托及接口的协变与逆变的问题,在网上搜索的时候,人们都是在反复地强调协变和逆变的概念,强调什么时候要加关键词out,什么时候要加in。可是鲜有人去说明:为何这时要用out,为什么就必须...

C# 泛型协变和逆变

泛型协变和反变 随Visual Studio 2010 CTP亮相的C#4和VB10,虽然在支持语言新特性方面走了相当不一样的两条路:C#着重增加后期绑定和与动态语言相容的若干特性,VB10着重...

10分钟了解C#中的协变和逆变

http://www.2cto.com/kf/201206/136883.html   作者:cnn237111 说十分钟可能有哗众取宠的嫌疑,本人写这个博客,话了半天时间,查阅了很多资料才...

C# 泛型的协变和逆变

泛型的协变和逆变 基类的变量赋值给派生类对象的实例 叫做赋值兼容性 如果某个返回的类型可以由其派生类类型替换,那么这个类型就是支持协变的 如果某个参数类型可以由其基类替换,那么这个类型就是支...

c# 逆变 协变的理解

c# 逆变 协变的理解

c#中泛型的协变与逆变:<in T>详解

MSDN上的demo:http://msdn.microsoft.com/zh-cn/library/dd469484.aspx
  • Joyhen
  • Joyhen
  • 2014年10月17日 16:25
  • 4430

C#协变与逆变

参照其他文章实现了协变和逆变的基本: using System; using System.Collections.Generic; using System.Linq; using Syste...
  • WuLex
  • WuLex
  • 2013年06月14日 14:07
  • 889

C#中的协变与抗变(逆变)

C# 中的协变与抗变(逆变)最近在看《C#高级编程(第九版)》这本书,看到了泛型接口这章。其中关于协变和逆变没太理解,网上查了许多资料,总算弄清楚了,来这里记录一下。 ### 协变 >当泛型接口类型仅...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c#协变-逆变复习
举报原因:
原因补充:

(最多只允许输入30个字)