A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© itheima_xu 中级黑马   /  2014-3-31 14:16  /  1151 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

C# 协变与逆变这块很模糊,能详细说明下吗

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

2 个回复

倒序浏览
1:逆变与协变概念
    “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型。
    “逆变”则是指能够使用派生程度更小的类型。
     如果泛型接口或委托的泛型参数声明为协变或逆变,则将该泛型接口或委托称为“变体”。



2:协变
     查看下面代码:

IEnumerable<String> strings = new List<String>();
IEnumerable<Object> objects = strings;


     在 .NET Framework 早期版本中,在 Option Strict On 条件下,此代码会导致 C# 和 Visual Basic 中出现编译错误。但是现在,您可以使用 strings 代替 objects,如上例所示,因为 IEnumerable<(Of <(T>)>) 接口为协变接口。



3:逆变
     逆变允许方法具有与接口的泛型形参所指定的实参类型相比,派生程度更小的实参类型。为展示逆变功能,假设您已创建 BaseComparer 类来比较 BaseClass 类的实例。BaseComparer 类实现 IEqualityComparer<BaseClass>(在 Visual Basic 中为 IEqualityComparer(Of BaseClass))接口。因为 IEqualityComparer<(Of <(T>)>) 接口现在为逆变接口,所以您可以使用 BaseComparer 来比较继承 BaseClass 类的类的实例。以下代码示例中演示了这一点。

// Simple hierarchy of classes.
class BaseClass { }
class DerivedClass : BaseClass { }

// Comparer class.
class BaseComparer : IEqualityComparer<BaseClass>
{
    public int GetHashCode(BaseClass baseInstance)
    {
        return baseInstance.GetHashCode();
    }
    public bool Equals(BaseClass x, BaseClass y)
    {
        return x == y;
    }
}
class Program
{
    static void Test()
    {
        IEqualityComparer<BaseClass> baseComparer = new BaseComparer();

        // Implicit conversion of IEqualityComparer<BaseClass> to
        // IEqualityComparer<DerivedClass>.
        IEqualityComparer<DerivedClass> childComparer = baseComparer;
    }
}
回复 使用道具 举报
shangxin 发表于 2014-4-1 10:35
1:逆变与协变概念
    “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型。
    “逆变 ...

谢谢,很详细,受用了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马