协变接口和逆变接口

协变性

interface IRetrivevWraper<out T>

{

    T GetData();

}

只要存在从类型A到类型B的有效转换,或者类型A派生自类型B,就可以将IRetrieveWrappter<A>对象赋给

IRetrieveWrapper<B>引用。

注意:

只有作为方法返回类型指定的类型参数才能使用out限定符。

只有接口和委托类型才能声明为协变量。不能为泛型类使用out修饰符。

逆变性

public interface ICompare<in T>

{

    int Compare(T x, T y);

}

in关键字明确告诉C#编译器:程序员要么传递T作为方的参数类型,要么传递T的派生类型。程序员不能将T用作任何方法的返回类型。

难点

协变:IRetrieveWrapper<object> = stringWrapper;//存在string到object的有效转换,所以可以将IRetrieveWrapper<string>对象赋值给IRetrieveWrapper<object>引用。

逆变:IComparer<string> stringComparator = objectComparer;//逆变是作为参数存在的,因为string中存在object中存在的属性和方法,所以ICompare<object>可以赋值给IComparer<String>引用。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容