c#协变-逆变复习

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");

    }
}











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值